使用插入式闭包[Swift]

使用插入式闭包[Swift],swift,break,Swift,Break,在我的swift应用程序中,我具有以下功能: func getImages() { var i = 0 K: while (true) { let downloadURL = URL(string: "serverURL") Database.downloadImage(withURL: downloadURL!) { (image) in if image == nil { break } s

在我的swift应用程序中,我具有以下功能:

func getImages() {

    var i = 0
    K: while (true) {
        let downloadURL = URL(string: "serverURL")
        Database.downloadImage(withURL: downloadURL!) { (image) in

            if image == nil { break }

            self.imagesArray.append(image!)
            self.collectionView?.reloadData()
            i += 1
        }
    }
}
这个想法是从服务器获取图像,但我不知道图像的确切数量。 但这是检查nil值的if语句的错误:

未标记的“中断”仅允许在环路或交换机内部使用,需要标记的中断才能退出if或do


如何解决,是否需要知道图像的数量以限制循环?

设计知道图像的数量非常重要,您可以使用此选项

func getImages(_ i:Int) {

        let downloadURL = URL(string: "serverURL")
        Database.downloadImage(withURL: downloadURL!) { (image) in

            if let img = image { 

            self.imagesArray.append(img)
            self.collectionView?.reloadData()
            getImages(i+1)

           }
           else {
               print("image is nil final call")
           }
        }
    }
}

也可能是下载依赖于i,因为不进行无限循环

请勿在此处使用
while(true)
循环。在第一次下载完成之前,它将启动数千次下载。我必须使用什么?正如rmaddy所说,您的代码是一个火车残骸,不可能正常工作。不要使用这种方法@Sh_Khan的方法是可行的。所以你试图下载相同的图像
i
多次,直到最终失败?我不明白,你想做什么?@Alexander我不认为是这样的,因为这是毫无意义的。这种连续下载也是非常不理想的。旁注,不要做
!=无
<代码>。只需使用条件绑定即可。@Alexander每次下载都应该依赖于i,因为下载次数未知,所以这是一种直接的方法,我无法初始化未知结果的并发请求,是的,如果让我们在这里,因为我想解决主要问题case@Sh_Khan这个问题只需要OP提出更明确的要求。尽管如此,这还是可以通过将其分为批
n
并发下载,并在下载后丢弃任何不想要的结果来改进。它会导致一些无关的下载,但会加快总时间
n
次。