2015-05-05 6 views
2

Я пытаюсь понять 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. Я в тупике, поэтому я считаю, что лучше попробовать этот форум (мой первый пост!). Надеюсь, я включил достаточно необходимую информацию, чтобы быть полезной.

ответ

1

Ваша функция showImage использует editImage CKRecord. Вы также перезагрузили эту запись? В противном случае поле «Изображение» в этой записи будет содержать старый CKAsset.

Помимо простой перезагрузки в тот момент, когда вы чувствуете себя хорошо, вы также можете внести изменения, создав подписку CloudKit. Тогда ваши данные будут даже изменены, когда они будут активны и изменены кем-то другим.

+0

Я только начинаю читать о подписках вчера. Я думаю, что вы правы, идея подписки кажется лучшим способом.Теперь мне нужно найти примеры подписки в Swift, чтобы я мог понять, как они работают. Спасибо за вашу помощь! – BrianSD

+0

Я могу посоветоваться с помощью https://github.com/evermeer/EVCloudKitDao ;-) –

Смежные вопросы