For Loop 在 ViewDidLoad 中不是 运行 - 其他都是
For Loop not running in ViewDidLoad - everything else is
下载餐厅函数returns2,所以不是空数组的问题。但是,当我尝试获取数组中的每个值并将其放入我的 for 循环以向地图添加注释时,没有任何反应。没有打印语句,没有注释。我在当前循环中有一个打印语句,它没有 运行,但我不确定为什么它不是 运行ning.
我尝试将 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()
}
}
}
我已经尝试实现这里描述的这个功能,但没有成功,因为我们的代码非常相似:
当您迭代 restaurantArray 时它为空的原因是因为查询是异步执行的。 viewDidLoad()
将在您的查询 returns 结果之前完整执行。您可以在程序的输出中看到这一点。即使您先调用 downloadRestaurants()
,它也会在 "Downloading" 之前打印 "Hi Again"。
下载餐厅函数returns2,所以不是空数组的问题。但是,当我尝试获取数组中的每个值并将其放入我的 for 循环以向地图添加注释时,没有任何反应。没有打印语句,没有注释。我在当前循环中有一个打印语句,它没有 运行,但我不确定为什么它不是 运行ning.
我尝试将 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()
}
}
}
我已经尝试实现这里描述的这个功能,但没有成功,因为我们的代码非常相似:
当您迭代 restaurantArray 时它为空的原因是因为查询是异步执行的。 viewDidLoad()
将在您的查询 returns 结果之前完整执行。您可以在程序的输出中看到这一点。即使您先调用 downloadRestaurants()
,它也会在 "Downloading" 之前打印 "Hi Again"。