2015-07-16 5 views
3

У меня есть кнопка для сохранения данных изображения в основных данных, но когда я нажимаю ее, она замерзает, потому что размер данных большой. Я попытался использовать dispatch_async, но это не сработало. Как создать значок/индикатор, показывающий, что он загружается/закладок, а не просто замерзает?Показать индикатор при сохранении данных ядра Swift

 @IBAction func save() { 

    let content = self.foodMenu?["content"].string 
    let urlString = self.foodMenu?["thumbnail_images"]["full"]["url"] 
    let urlshare = NSURL(string: urlString!.stringValue) 
    let imageData = NSData(contentsOfURL: urlshare!) 
    let images = UIImage(data: imageData!)  


    dispatch_async(dispatch_get_main_queue(), { 


    if let managedObjectContext = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext { 


     self.foodClass = NSEntityDescription.insertNewObjectForEntityForName("Foods", 
      inManagedObjectContext: managedObjectContext) as! Foods 

     self.foodClass.content = content 
     self.foodClass.image = UIImageJPEGRepresentation(images, 1) 


     var e: NSError? 
     if managedObjectContext.save(&e) != true { 
      println("insert error: \(e!.localizedDescription)") 
      return 
     } 
    } 
+1

Причина, по которой приложение по-прежнему зависает при попытке отправить его в отдельный поток, связано с тем, что вы помещаете его в основной поток. Вы действительно должны это делать, чтобы отправить его в отдельный поток, чтобы приложение не зависало. dispatch_async (dispatch_get_global_queue (int (QOS_CLASS_USER_INITIATED.value), 0)) – Aaron

+0

Чтобы показать индикатор активности, вам нужно поместить его в свое представление, создать IBOultet и когда вы хотите, чтобы он отображался только для вызова activityIndicator.startAnimating() для анимации и ActivityIndicator .stopAnimating(), чтобы остановить его. – Brduca

+0

Спасибо, ребята. – user2952122

ответ

1

Во-первых, маловероятно, что это медленное сохранение. Я подозреваю, что ваше создание JPEG-изображения является медленной частью.

Во-вторых, вы хотите скрыть проблему, поместив счетчик. Это действительно плохо для пользователя. Гораздо лучше сделать следующее (да, это больше кода);

  1. Переместить создание и сохранение изображения в фоновом режиме.
  2. Реструктурируйте свой стек основных данных, чтобы ваши данные сохранялись до . Диски находятся в частной очереди.

Это связано с использованием фоновой очереди и нескольких контекстов в Core Data, но получение этой обработки данных из потока пользовательского интерфейса является правильным ответом.

+0

Спасибо Marcus S. Zarra – user2952122

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