下载餐厅功能返回2,因此它不是空数组的问题。但是,当我尝试获取数组中的每个值并通过我的for循环将其添加到地图时,没有任何反应。没有打印声明,没有注释。我在当前循环中有一个print语句但它没有运行,但我不确定它为什么没有运行。
我尝试将for循环放在它自己的函数中并在下载功能之后放置但没有区别。
我包括整个代码,以便最好地提供有关此问题的所有信息
import UIKit
import CloudKit
import SafariServices
import MapKit
import GoogleMobileAds
class InterFood: UIViewController, MKMapViewDelegate {
@IBOutlet weak var myMap: MKMapView!
var bannerView: GADBannerView!
var restaurantArray: Array<CKRecord> = []
var index: NSIndexPath!
var pin: AnnotationPin!
override func viewDidLoad() {
super.viewDidLoad()
print("Hi")
self.myMap.delegate = self
self.navigationItem.backBarButtonItem = UIBarButtonItem(title:"", style:.plain, target:nil, action:nil)
func downloadRestaurants () {
let publicDB = CKContainer.default().publicCloudDatabase
let predicate = NSPredicate(value: true)
let query = CKQuery(recordType: "InternationalCenter", predicate: predicate)
query.sortDescriptors = [NSSortDescriptor(key: "Name", ascending: true)]
publicDB.perform(query, inZoneWith: nil) { (results, error) -> Void in
if (error != nil) {
print("Error" + (error?.localizedDescription)!)
} else {
for result in results! {
self.restaurantArray.append(result)
}
OperationQueue.main.addOperation( { () -> Void in
self.myMap.reloadInputViews()
// activityIndicator.isHidden = true
print("Downloading")
print(self.restaurantArray.count)
})
}
}
}
downloadRestaurants()
print("Hi Again")
self.title = "International Center"
let coordinate = CLLocationCoordinate2D(latitude: 42.722869, longitude: -84.488012)
let region = MKCoordinateRegionMakeWithDistance(coordinate, 2000, 2000)
myMap.setRegion(region, animated: true)
for res in restaurantArray {
pin = AnnotationPin(title: res.value(forKey: "Name") as! String, subtitle: "Address", theCoordinates: res.value(forKey: "Location") as! CLLocationCoordinate2D, theWeb: "https://google.com")
myMap.addAnnotation(pin)
self.myMap.reloadInputViews()
}
}
}
我已尝试实现此处所述的此功能,但没有成功,因为我们的代码非常相似:how to set up array for multi annotations with swift
答案 0 :(得分:3)
当您迭代它时,restaurantArray为空的原因是因为查询是异步执行的。在查询返回结果之前,viewDidLoad()
将完整执行。您可以在程序的输出中看到这一点。即使您先调用downloadRestaurants()
,它也会在“正在下载”之前打印“Hi Again”。