Ios 基于customObject属性的订单集合视图单元格-Swift 4-Xcode 9

Ios 基于customObject属性的订单集合视图单元格-Swift 4-Xcode 9,ios,arrays,swift,uicollectionview,Ios,Arrays,Swift,Uicollectionview,我目前正在使用AlamofireImage从firebase下载我的图像。图像进入集合视图,图像的顺序很重要。我已经做了,所以每张照片都有一个标签 下面是我的照片课: class businessPhoto { var image = UIImage() var url = String() var tag = Int() } 我知道Alamofire是异步的。下载完成后,我在排序阵列时遇到问题 (与下载实际完成与for循环完成有关) 以下是我得到的: 这就是我需要的: 我的代码:

我目前正在使用AlamofireImage从firebase下载我的图像。图像进入集合视图,图像的顺序很重要。我已经做了,所以每张照片都有一个标签

下面是我的照片课:

class businessPhoto {

var image = UIImage()
var url = String()
var tag = Int()

}
我知道Alamofire是异步的。下载完成后,我在排序阵列时遇到问题

(与下载实际完成与for循环完成有关)

以下是我得到的:

这就是我需要的:

我的代码:

    // Creates an Array of URLS
func createURLArray() {

    if selectedBusiness.image1URL?.isEmpty == false {

        imageURLS.append(selectedBusiness.image1URL!)

    } else {

        let placeholder = "--"
        imageURLS.append(placeholder)

    }

    if selectedBusiness.image2URL?.isEmpty == false {

        imageURLS.append(selectedBusiness.image2URL!)

    } else {

        let placeholder = "--"
        imageURLS.append(placeholder)

    }

    if selectedBusiness.image3URL?.isEmpty == false {

        imageURLS.append(selectedBusiness.image3URL!)

    } else {

        let placeholder = "--"
        imageURLS.append(placeholder)

    }

    if selectedBusiness.image4URL?.isEmpty == false {

        imageURLS.append(selectedBusiness.image4URL!)

    } else {

        let placeholder = "--"
        imageURLS.append(placeholder)

    }

    if selectedBusiness.image5URL?.isEmpty == false {

        imageURLS.append(selectedBusiness.image5URL!)

    } else {

        let placeholder = "--"
        imageURLS.append(placeholder)

    }

    if selectedBusiness.image6URL?.isEmpty == false {

        imageURLS.append(selectedBusiness.image6URL!)

    } else {

        let placeholder = "--"
        imageURLS.append(placeholder)

    }

    if selectedBusiness.image7URL?.isEmpty == false {

        imageURLS.append(selectedBusiness.image7URL!)

    } else {

        let placeholder = "--"
        imageURLS.append(placeholder)

    }
    downloadImages(URLArray: imageURLS)

}





// ** Image Download
func downloadImages(URLArray: [String]) {

    for stringURL in URLArray {

        // Temporary Object 
        let object = businessPhoto()

        //Sets tag for object
        if stringURL == imageURLS[0] {

            object.tag = 1

        } else if stringURL == imageURLS[1] {

            object.tag = 2

        } else if stringURL == imageURLS[2] {

            object.tag = 3

        } else if stringURL == imageURLS[3] {

            object.tag = 4

        } else if stringURL == imageURLS[4] {

            object.tag = 5

        } else if stringURL == imageURLS[5] {

            object.tag = 6

        } else if stringURL == imageURLS[6] {

            object.tag = 7
        }

        if stringURL == "--" {


        } else {

            // Downloads Image 
            let url = URL(string: stringURL)
            Alamofire.request(url!).responseImage { response in


                if let image = response.result.value {

                    DispatchQueue.main.async {
                        object.image = image
                        object.url = stringURL
                        self.currentImages.append(object)
                        self.photoCollectionView.reloadData()
                    }


                } else {


                    object.image = #imageLiteral(resourceName: "image-failed")
                    object.url = "--"
                    self.currentImages.append(object)
                    //self.photoCollectionView.reloadData()
                }
            }

        }


    }
    //completion()
}

//This function should update the collection view to show the photos sorted by their tag but does nothing
 func updateCollectionView() {

    print("UPDATING COLLECTION VIEW")
    print(currentImages)
    currentImages.sort(by: { $0.tag > $1.tag })
    self.photoCollectionView.reloadData()


}

在我看来,让它有一个正确的顺序。跟我走

  • 创建
    self.currentImages
    ,如果它不存在,则在方法
    downloadImages
    的开头创建7个空
    UIImage
  • 使用
    self.currentImages.insert(object,atIndex:object.tag)
    代替
    self.currentImages.append(object)

编辑

func checkAndAddUrl(url : String) {
  if url?.isEmpty == false {
    imageURLS.append(url!)
  } else {
    let placeholder = "--"
    imageURLS.append(placeholder)
  }
}

func createURLArray() {

  checkAndAddUrl(selectedBusiness.image1URL)
  checkAndAddUrl(selectedBusiness.image2URL)
  checkAndAddUrl(selectedBusiness.image3URL)
  checkAndAddUrl(selectedBusiness.image4URL)
  checkAndAddUrl(selectedBusiness.image5URL)
  checkAndAddUrl(selectedBusiness.image6URL)
  checkAndAddUrl(selectedBusiness.image7URL)

  downloadImages(URLArray: imageURLS)

}





// ** Image Download
func downloadImages(URLArray: [String]) {

  for stringURL in URLArray {

    // Temporary Object
    let object = businessPhoto()

    object.tag = URLArray.indexOf(stringURL)

    if stringURL == "--" {


    } else {

      // Downloads Image
      let url = URL(string: stringURL)
      Alamofire.request(url!).responseImage { response in


        if let image = response.result.value {

          DispatchQueue.main.async {
            object.image = image
            object.url = stringURL
            self.currentImages.append(object)
            self.photoCollectionView.reloadData()
          }


        } else {


          object.image = #imageLiteral(resourceName: "image-failed")
          object.url = "--"
          self.currentImages.append(object)
          //self.photoCollectionView.reloadData()
        }
      }

    }


  }
  //completion()
}

//This function should update the collection view to show the photos sorted by their tag but does nothing
func updateCollectionView() {

  print("UPDATING COLLECTION VIEW")
  print(currentImages)
  currentImages.sort(by: { $0.tag > $1.tag })
  self.photoCollectionView.reloadData()


}

啊,是的,这很有道理。我试试这个。如果行得通,我会接受你的回答。如果你做不到,请告诉我。我将向您展示代码不起作用的原因;)@再一次,您不需要使用
if
来检查和设置
对象的
标记。让我们在
URLArray
中获取
stringURL
的索引,并为
对象的
标记设置它。是分拣机和清洗器有更好的方法吗?如果是这样,我很想知道。我知道我的方法非常重复。@27我已经更新了我的答案。您可以使用“编辑”再次检查它。希望它能帮助您改进代码。
func checkAndAddUrl(url : String) {
  if url?.isEmpty == false {
    imageURLS.append(url!)
  } else {
    let placeholder = "--"
    imageURLS.append(placeholder)
  }
}

func createURLArray() {

  checkAndAddUrl(selectedBusiness.image1URL)
  checkAndAddUrl(selectedBusiness.image2URL)
  checkAndAddUrl(selectedBusiness.image3URL)
  checkAndAddUrl(selectedBusiness.image4URL)
  checkAndAddUrl(selectedBusiness.image5URL)
  checkAndAddUrl(selectedBusiness.image6URL)
  checkAndAddUrl(selectedBusiness.image7URL)

  downloadImages(URLArray: imageURLS)

}





// ** Image Download
func downloadImages(URLArray: [String]) {

  for stringURL in URLArray {

    // Temporary Object
    let object = businessPhoto()

    object.tag = URLArray.indexOf(stringURL)

    if stringURL == "--" {


    } else {

      // Downloads Image
      let url = URL(string: stringURL)
      Alamofire.request(url!).responseImage { response in


        if let image = response.result.value {

          DispatchQueue.main.async {
            object.image = image
            object.url = stringURL
            self.currentImages.append(object)
            self.photoCollectionView.reloadData()
          }


        } else {


          object.image = #imageLiteral(resourceName: "image-failed")
          object.url = "--"
          self.currentImages.append(object)
          //self.photoCollectionView.reloadData()
        }
      }

    }


  }
  //completion()
}

//This function should update the collection view to show the photos sorted by their tag but does nothing
func updateCollectionView() {

  print("UPDATING COLLECTION VIEW")
  print(currentImages)
  currentImages.sort(by: { $0.tag > $1.tag })
  self.photoCollectionView.reloadData()


}