Xcode 未在正确的时间执行函数,但在完成块后执行
需要帮助才能弄清楚为什么我的函数在我认为应该执行的时候没有执行,但它在代码中的完成块之后执行。我对Xcode相当陌生,所以如果这里的事情听起来很混乱,请原谅。下面是我的代码 类图像下载器{Xcode 未在正确的时间执行函数,但在完成块后执行,xcode,function,completion-block,Xcode,Function,Completion Block,需要帮助才能弄清楚为什么我的函数在我认为应该执行的时候没有执行,但它在代码中的完成块之后执行。我对Xcode相当陌生,所以如果这里的事情听起来很混乱,请原谅。下面是我的代码 类图像下载器{ typealias completionHandler = (Result<Set<ARReferenceImage>, Error>) -> () typealias ImageData = (image: UIImage, orientation: CGImageProper
typealias completionHandler = (Result<Set<ARReferenceImage>, Error>) -> ()
typealias ImageData = (image: UIImage, orientation: CGImagePropertyOrientation, physicalWidth: CGFloat, name: String)
static let URLDic = [ReferenceImagePayload]()
class func getDocumentData(completion:@escaping ([ReferenceImagePayload]) -> ()) {
var documentCollection: [ReferenceImagePayload] = []
db.collection("Users").getDocuments {(snapshot, error) in
if error == nil && snapshot != nil {
var index = 0
for document in snapshot!.documents {
let loadData = document.data()
index += 1
if loadData["Target URL"] != nil {
let url = loadData["Target URL"]
let urlString = URL(string: "\(String(describing: url ?? ""))")
let urlName = loadData["Target Image"]
documentCollection.append(ReferenceImagePayload(name: urlName as! String, url: urlString!))
if snapshot!.documents.count == index {
// After finished, send back the loaded data
completion(documentCollection)
}
}
}
}
}
}
static var receivedImageData = [ImageData]()
class func downloadImagesFromPaths(_ completion: @escaping completionHandler) {
//行“let loadedDataDic:()=getDocumentData”仅在此时执行
}您能更清楚地说明您的期望吗?由于您使用的是异步例程,因此很难预测执行顺序。@PhillipMills我希望在调用“class func downloadImagesFromPaths”后立即运行并执行函数getDocumentData,这就像跳过并仅在“let completionOperation=BlockOperation"已完成。异步不是这样工作的。函数会在您期望的时候调用,但只要
getDocuments
方法完成,内部的代码就会执行。@PhillipMills我有很多东西要学。感谢您的解释。对我应该做什么有什么建议吗?您需要隔离所有依赖于文档集合com的工作请完成。最好是在传递给getDocumentData
的完成处理程序中完成这项工作。另一种(较旧的)样式是在收集完成后发布通知,并根据通知执行这项工作。
let loadedDataDic: () = getDocumentData { (URLDic) in
print(URLDic.self, "Got it")
}
let operationQueue = OperationQueue()
operationQueue.maxConcurrentOperationCount = 6
let completionOperation = BlockOperation {
OperationQueue.main.addOperation({
completion(.success(referenceImageFrom(receivedImageData)))
})
}
URLDic.forEach { (loadData) in
let urlstring = loadData.url
let operation = BlockOperation(block: {
do{
let imageData = try Data(contentsOf: loadData.url)
print(imageData, "Image Data")
if let image = UIImage(data: imageData){
receivedImageData.append(ImageData(image, .up, 0.1, loadData.name))
}
}catch{
completion(.failure(error))
}
})
completionOperation.addDependency(operation)
}
operationQueue.addOperations(completionOperation.dependencies, waitUntilFinished: false)
operationQueue.addOperation(completionOperation)
}