Cloudkit & nspersistentCloudkitcontainer - Принесите Ckrecord of CreatorUserRecordid для каждого CKRecord в общедоступноIOS

Программируем под IOS
Ответить Пред. темаСлед. тема
Anonymous
 Cloudkit & nspersistentCloudkitcontainer - Принесите Ckrecord of CreatorUserRecordid для каждого CKRecord в общедоступно

Сообщение Anonymous »

Я не был уверен, как сформулировать вопрос. Я знаю, что это вводит в заблуждение. база данных. Модель Coredata имеет две конфигурации: локальные, облачные. Local соответствует базе данных Private CloudKit и Cloud в общедоступной базе данных CloudKit. Обе конфигурации содержат все объекты: список, список и подобный. Как (с обратным). < /P>
Реализация частной базы данных работает, как и ожидалось. Каждый из этих объектов может быть установлен как публичный или частный, используя атрибут ISPublic. Если пользователь обновляет атрибут iSpublic к True, копия списка или списка создается в общедоступной базе данных. Если пользователь устанавливает Ispublic FALSE, в списке или списке есть атрибут ISTRASHED, который установлен TRUE в общедоступной базе данных (не уверен, когда фактически удалить записи из общедоступной базы данных, но это для другого вопроса). br/> Пользователь также может просматривать все списки в общедоступной базе данных, используя nsfetchedresultscontroller для загрузки данных и для изменений монитора.
Проблема
Я могу отображать все общедоступные списки, используя UitableView и nsfetchedResultsController. У меня есть пользовательский uitableviewcell, который отображает пользователя, который создал имя пользователя ListItem и нравится как SO: < /p>
  • Получите CreatorUrecordid для nsmanagedObject с использованием nspersistentContcontainer.Record (для: Для: для: для: для: для: для: для: для: для: для: для: для: для: для: record.record.record. Record. ) < /li>
    Получить пользователя Ckrecord для CreatorUserRecordid с использованием ckcontainer.default (). publicclouddatabase.record (for :) < /li>
    Доступ к имени пользователя пользователя CKRECORD
Я делаю это асинхронное звонок для каждого uitableviewcell. это правильно? , если да, мне нужно будет реализовать механизм кэширования. Теперь у меня есть ячейка UitableView, у которой есть пустое имя пользователя. Должен ли я предварительно заранее предварительно подключить имя пользователя для всех элементов в NSFetchedResultsController? Это могут быть тысячи объектов, которые даже не отображались и увеличивают время загрузки. Пользователь, который создал CKRECORD? элемент списка. Значит ли это для каждого, как мне нужно сделать один и тот же процесс? Это означает, что у меня будет звонок API для каждого имени пользователя каждого элемента списка и каждого подобного каждого элемента списка ((1 + x) * y вызовы API; x = количество лайков, y = количество элементов списка).
Скажем, я показываю 100 списков в среднем 20 лайков. Это означает, что я сделаю:
(1 + 20) * 100 = 2100 вызовы API (без кэширования)
, что достигает 40 запросов/ Второй предел с менее чем 2 элементами списка. < /p>
Если требуется больше информации или больше кода, дайте мне знать. < /p>
Это кажется моим лучшим вариантом это создать пользовательский пользовательский объект в моей модели Coredata, так как настройка NSPersistEntCloudKitContainer приносит мне отношения. />public func configure(listItem: ListItem, environment: Environment) {
self.listItem = listItem
self.environment = environment
self.userRecordId = self.environment?.coreDataStack.creatorUserRecordID(for: listItem)

self.fetchUserTask?.cancel()

self.fetchUserTask = Task {
guard let userRecordId = self.userRecordId,
let userRecord = try? await CKContainer.default().publicCloudDatabase.record(for: userRecordId) else {
self.userNameLabel.text = "I'm server poor. You can't view this information."
return
}

if !Task.isCancelled {
Task { @MainActor in
self.userRecord = userRecord
self.userNameLabel.text = self.userRecord?["username"]
}
}
}

self.contentTextView.text = listItem.title

self.dateCreatedLabel.text = DateFormatter.localizedString(
from: listItem.modifiedAt!,
dateStyle: .medium,
timeStyle: .short
)

let likes = self.listItem?.likes
self.likeButton.setTitle("\(likes?.count ?? 0)", for: .normal)

if let likes = likes?.allObjects as? [Like] {
for like in likes {
guard let userRecordId = self.environment?.coreDataStack.creatorUserRecordID(for: like) else {
self.likeButton.isEnabled = false
continue
}

if userRecordId.recordName == CKCurrentUserDefaultName {
self.likeButton.isEnabled = false
break
}
}
}
}


Подробнее здесь: https://stackoverflow.com/questions/793 ... oruserreco
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «IOS»