array.insert at: заменяет элемент вместо вставки в указанное место в Swift, почему? - PullRequest
0 голосов
/ 03 октября 2018

У меня есть следующая imagePickerController функция делегата, каждый раз, когда я выбираю изображение, оно заменяет предыдущее urlString загруженного изображения на Firebase Storage вместо , вставляя со второго до последнего массива.count - 1 позиция (по замыслу, поскольку я использую последнюю запись для удаления из очереди другого cell в collectionview) массива images.В результате последнее изображение urlString всегда заменяется самым последним.

Я должен добавить , если я загружаю одно изображение за раз, удаляясь от текущего VC, затем возвращаясь и загружая другоеизображение снова, затем оно работает как положено.

Результат операторов печати в коде выглядит следующим образом:

Загрузить изображение 1:

0. ADDING images.count: 3
1. ADDING images.count: 4
2. ADDING images.count: 4
images.last item: Optional("dummy string")

Загрузить изображение 2 ( количество изображений не увеличилось ):

0. ADDING images.count: 4
1. ADDING images.count: 4
2. ADDING images.count: 4 
images.last item: Optional("dummy string")

Функция:

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {

        self.dismiss(animated: true, completion: nil)

        Utilities.run.showSVHUD(uiView: self.view, status: "Saving")

        var selectedImageFromPicker: UIImage?

        if let editedImage = info["UIImagePickerControllerEditedImage"] as? UIImage {
            selectedImageFromPicker = editedImage
        } else if let originalImage = info["UIImagePickerControllerOriginalImage"] as? UIImage {

            selectedImageFromPicker = originalImage
        }

        if let selectedImage = selectedImageFromPicker {

            guard let uid = Auth.auth().currentUser?.uid else { return }

            print("0. ADDING images.count: \(self.images.count)")

            DataService.run.uploadProfileImageToFirebaseStorage(image: selectedImage) { (success, urlString) in

                self.images.insert(urlString, at: self.images.count - 1)
                print("1. ADDING images.count: \(self.images.count)")
                let slice = self.images.dropLast()
                let urlArray = Array(slice) //Converting Slice to Array
                let dictionary = urlArray.indexedDictionary //converting to Dictionary

                DataService.run.updateProfileImagesValueForUser(uid: uid, imagesUrls: dictionary, handler: { (success) in

                    if success {
                        Utilities.run.dismissSVHUD(delay: 0.5)
                        print("2. ADDING images.count: \(self.images.count)")
                        print("images.last item: \(String(describing: self.images.last))")
                        self.collectionView.reloadData()
                        self.collectionView.layoutIfNeeded()
                    }//end if success

                })// end updateProfileImagesValueForUser

            }//end uploadProfileImageToFirebaseStorage

        }//end if let selectedImage = selectedImageFromPicker

    }//end func

images массив инициируется из переданного объекта User, который содержит массивString объектов.

func initData(forUser user:User) {

    self.user = user

}//end func

setupviews() вызывается в viewWillAppear(), который инициализирует images массив

func setupViews(){

    images = user!.profileImages

    images.append("dummy string")

    let imageString = user!.profilePictureURL
    let url = URL(string: imageString)//create URL from string
    profileImg.sd_setImage(with: url, placeholderImage: #imageLiteral(resourceName: "placeholder"), options: [.continueInBackground])

}//end func
...