2016-12-13 4 views
2

У меня есть настройки для выбора изображения следующим образом:Как не выполнить запрос на viewDidAppear, как только изображение было выбрано JUST?

@IBOutlet weak var imageHolder: UIImageView! 
    @IBAction func addImage(_ sender: UIButton) { 
     let pickerController = UIImagePickerController() 
     pickerController.delegate = self 
     pickerController.sourceType = UIImagePickerControllerSourceType.photoLibrary 
     pickerController.allowsEditing = true 
     self.present(pickerController, animated: true, completion: nil)  
    } 
    var imageSaved = UIImage() 

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingImage image: UIImage, editingInfo: [String : AnyObject]?) { 
     self.dismiss(animated: true, completion: nil) 
     self.imageHolder.image = image 
     imageSaved = image 
    } 

Выбор сборщика вызывает все фотографии на тренажере, то пользователь может выбрать их. После его выбора представление возвращается к исходному виду и отображает изображение в изображении. Однако он не сохраняется, пока в этом представлении не будет нажата кнопка «Сохранить». Все это прекрасно работает. Кнопка сохранения - это просто действие, которое сохраняет файл изображения в БД.

У меня есть viewDidAppear, настроенный для запроса БД и отображения изображения, которое было сохранено, как только пользователь переместится в это представление ... это также хорошо работает. Однако, поскольку viewDidAppear выполняется несколько раз, возникает проблема, когда новое изображение сначала выбирается для замены старого. Кнопка «Сохранить» удаляет старый объект и заменяет его, поэтому после его замены все работает нормально. Однако после выбора изображения в подборщике (и до, нажимая «Сохранить» ... и поэтому до того, как этот файл находится в БД), вкратце отобразится вновь выбранное изображение, но viewDidAppear снова запустится и отправит его обратно к изображению, находящемуся в настоящее время в БД. Это не технически ошибка, но она уродливая, и я бы хотел, чтобы она была исправлена, но я не знаю, как это сделать.

Это viewDidAppear код также:

override func viewDidAppear(_ animated: Bool) { 
     let query = PFQuery(className: "ProfilePictures") 
     query.whereKey("user", equalTo: (PFUser.current()?.objectId!)! as String) 
     query.findObjectsInBackground { (objects, error) in 
      if let objectss = objects{ 
       if objectss.count != 0{ 
        for object in objectss{ 
         let imagePulled = object["ProfilePicture"] as! PFFile 
         imagePulled.getDataInBackground(block: { (data, error) in 
          if let downloadedImage = UIImage(data: data!){ 
           self.imageHolder.image = downloadedImage 
          } else{ 
           print(error) 
          } 
         }) 
        } 

       } 
      } 
      } 
    } 

По существу, как я могу получить изображение, чтобы показывать только недавно выбранного изображения в этом пространстве между выбрав его и нажав сохранить?

ответ

1

Вы должны перенести свой первоначальный запрос в viewDidLoad(). Это вызвано только один раз, поэтому он не будет заменять ваше изображение каждый раз, когда появится представление.

В противном случае, если по какой-либо причине вам необходимо иметь его в поле зрения viewDidAppear(), вы можете использовать dispatch_once, чтобы убедиться, что ваш запрос запускается только при первом просмотре.

Грубый пример использования dispatch_once:

var token: dispatch_once_t = 0 
dispatch_once(&token) {() -> Void in 
    // your query goes here 
} 

Если вы используете Swift 3 см это other response о том, как получить dispatch_once как функциональность.

+0

Хорошо, что делает. Единственная причина, по которой я его использую в 'viewDidAppear', - это потому, что он быстрее загружается, чем в' viewDidLoad'. Это неправильный способ сделать это (если я просто исправлю свою конкретную проблему с 'dispatch_once', которую вы предложили?) –

+0

Кроме того, при попытке использовать' dispatch_once_t' мне присваивается ошибка: dispatch_once_t недоступен в swift: используйте лениво вместо инициализированных глобалов " –

+0

См. обновленный ответ. –

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