问题描述
需要帮助弄清楚为什么我的功能在我认为应该执行时不执行,而是在代码中的完成块之后执行。我对Xcode还是很陌生,所以如果这里听起来令人困惑,请原谅。下面是我的代码。
ImageDownloader类
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 { (URLDic) in
print(URLDic.self,"Got it")
}
let operationQueue = OperationQueue()
operationQueue.maxConcurrentOperationCount = 6
let completionoperation = BlockOperation {
OperationQueue.main.addOperation({
completion(.success(referenceImageFrom(receivedImageData)))
// LINE“ letloadDataDataic:()= getDocumentData”仅在此点执行
})
}
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)
}
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)