Я пытаюсь понять CloudKit, но у меня проблема с проблемой реального мира, если я в конечном итоге превратил ее в приложение.Перезагрузка данных CloudKit, когда приложение выходит на передний план
У меня есть диспетчер tableview, который заполнен CloudKit, который отлично работает. У меня есть контроллер detailview, который вызывается при нажатии одной из записей в контроллере tableview. Контроллер detailview извлекает дополнительные данные из CloudKit, которые не были в начальном контроллере tableview. Все это прекрасно работает.
Теперь detailviewcontroller позволяет изменять изображение и сохранять его обратно в общедоступную базу данных. Это прекрасно работает.
Сценарий, с которым я имею дело, - это мысль о том, что эта основная функция используется в приложении несколькими людьми. Если один человек загружает фотографию (переписывая существующую фотографию для одной из записей), что произойдет, если другой пользователь в настоящее время имеет приложение в фоновом режиме? Если они откроют приложение, они будут видеть последнюю фотографию, которую они видели на этой странице, а не новую фотографию. Поэтому я хочу перезагрузить данные из CloudKit, когда приложение вернется на передний план, но я должен делать что-то неправильно, потому что он не работает. Используя симулятор и мой фактический телефон, я могу изменить фотографию на одном устройстве, а другое устройство (симулятор или телефон) не обновляет данные, когда оно входит в передний план.
Вот код, я использую: Первый в ViewController.swift:
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
println("viewDidLoad")
NSNotificationCenter.defaultCenter().addObserver(self, selector: "activeAgain", name: UIApplicationWillEnterForegroundNotification, object: nil)
, а затем функция activeAgain:
func activeAgain() {
println("Active again")
fetchItems()
self.tblItems.reloadData()
println("Table reloaded")
}
, а затем функция fetchItems:
func fetchItems() {
let container = CKContainer.defaultContainer()
let publicDatabase = container.publicCloudDatabase
let predicate = NSPredicate(value: true)
let query = CKQuery(recordType: "Items", predicate: predicate)
publicDatabase.performQuery(query, inZoneWithID: nil) { (results, error) -> Void in
if error != nil {
println(error)
}
else {
println(results)
for result in results {
self.items.append(result as! CKRecord)
}
NSOperationQueue.mainQueue().addOperationWithBlock({() -> Void in
self.tblItems.reloadData()
self.tblItems.hidden = false
})
}
}
}
Я попытался добавить функцию перезагрузки в viewWillAppear, но это действительно не помогло:
override func viewWillAppear(animated: Bool) {
tblItems.reloadData()
}
Теперь вот код в DetailViewController.swift:
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
NSNotificationCenter.defaultCenter().addObserver(self, selector: "activeAgain", name: UIApplicationWillEnterForegroundNotification, object: nil)
self.imageScrollView.contentSize = CGSizeMake(1000, 1000)
self.imageScrollView.frame = CGRectMake(0, 0, 1000, 1000)
self.imageScrollView.minimumZoomScale = 1.0
self.pinBoardScrollView.maximumZoomScale = 8.0
showImage()
, а затем функция ShowImage:
func showImage() {
imageView.hidden = true
btnRemoveImage.hidden = true
viewWait.hidden = true
if let editedImage = editedImageRecord {
if let imageAsset: CKAsset = editedImage.valueForKey("image") as? CKAsset {
imageView.image = UIImage(contentsOfFile: imageAsset.fileURL.path!)
imageURL = imageAsset.fileURL
self.title = "Image"
imageView.hidden = false
btnRemoveImage.hidden = false
btnSelectPhoto.hidden = true
}
}
}
и функция activeAgain:
func activeAgain() {
showImage()
println("Active again")
}
Ни один из эти ViewControllers перезагружают данные f rom CloudKit, когда они вернутся. Это похоже на кэширование данных таблицы для первого ViewController и изображения для DetailViewController, и он использует это вместо загрузки фактических данных CloudKit. Я в тупике, поэтому я считаю, что лучше попробовать этот форум (мой первый пост!). Надеюсь, я включил достаточно необходимую информацию, чтобы быть полезной.
Я только начинаю читать о подписках вчера. Я думаю, что вы правы, идея подписки кажется лучшим способом.Теперь мне нужно найти примеры подписки в Swift, чтобы я мог понять, как они работают. Спасибо за вашу помощь! – BrianSD
Я могу посоветоваться с помощью https://github.com/evermeer/EVCloudKitDao ;-) –