Swift For循环未在ViewDidLoad中运行-其他所有内容都是
download restaurant函数返回2,因此它不是空数组的问题。但是,当我尝试获取数组中的每个值并将其放入for循环以向映射添加注释时,什么都没有发生。没有打印语句,没有注释。我在当前循环中有一个print语句,它没有运行,但我不确定它为什么没有运行 我尝试将for循环放在它自己的函数中,并将其放在下载函数之后,但没有区别 我包含了完整的代码,以最好地提供有关此问题的所有信息Swift For循环未在ViewDidLoad中运行-其他所有内容都是,swift,for-loop,mapkit,mkannotation,ckrecord,Swift,For Loop,Mapkit,Mkannotation,Ckrecord,download restaurant函数返回2,因此它不是空数组的问题。但是,当我尝试获取数组中的每个值并将其放入for循环以向映射添加注释时,什么都没有发生。没有打印语句,没有注释。我在当前循环中有一个print语句,它没有运行,但我不确定它为什么没有运行 我尝试将for循环放在它自己的函数中,并将其放在下载函数之后,但没有区别 我包含了完整的代码,以最好地提供有关此问题的所有信息 import UIKit import CloudKit import SafariServices impo
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()
}
}
}
导入UIKit
导入CloudKit
进口狩猎服务
导入地图套件
进口谷歌手机
类InterFood:UIViewController,MKMapViewDelegate{
@ibvar-myMap:MKMapView!
var bannerView:GADBannerView!
var restaurantArray:Array=[]
var索引:nsindepath!
变量pin:AnnotationPin!
重写func viewDidLoad(){
super.viewDidLoad()
打印(“Hi”)
self.myMap.delegate=self
self.navigationItem.BackBarButtonim=UIBarButtonim(标题:,样式:。普通,目标:nil,操作:nil)
func下载餐厅(){
让publicDB=CKContainer.default().publicCloudDatabase
let谓词=NSPredicate(值:true)
let query=CKQuery(记录类型:“InternationalCenter”,谓词:谓词)
query.sortDescriptors=[NSSortDescriptor(键:“Name”,升序:true)]
perform(query,inZoneWith:nil){(results,error)->Void in
如果(错误!=nil){
打印(“错误”+(错误?.localizedDescription)!)
}否则{
为结果而努力{
self.restaurantArray.append(结果)
}
OperationQueue.main.addOperation({()->中的Void)
self.myMap.reloadInputViews()
//activityIndicator.isHidden=true
打印(“下载”)
打印(self.restaurantArray.count)
})
}
}
}
下载餐厅()
打印(“再次你好”)
self.title=“国际中心”
let坐标=CLLocationCoordinate2D(纬度:42.722869,经度:-84.488012)
设region=mk坐标regionmakewithdistance(坐标,2000,2000)
myMap.setRegion(区域,动画:true)
餐馆里的餐厅{
pin=注释pin(标题:res.value(forKey:“Name”)as!字符串,副标题:“Address”,坐标:res.value(forKey:“Location”)as!cllocationCoordinated2D,网络:https://google.com")
myMap.addAnnotation(pin)
self.myMap.reloadInputViews()
}
}
}
我已经尝试实现这里描述的这个函数,但是没有成功,因为我们的代码非常相似:
当您在restaurantArray上进行迭代时,restaurantArray为空的原因是查询是异步执行的
viewDidLoad()
将在查询返回结果之前完整执行。您可以在程序的输出中看到这一点。即使您先调用downloadRestaurants()
,它也会在“下载”之前再次打印“Hi”。这是异步调用的本质。请注意,如果在“下载”之前打印“再次你好”,您会建议我如何处理这个问题?由于是异步的,我应该为查询使用一个defer函数,然后让for循环运行吗?