在 Swift 中 运行 查询 API 时如何显示加载屏幕?
How do I show a loading screen while running an API query in Swift?
我正在尝试弄清楚如何在 运行 查询 API 查询和保存数据时显示加载屏幕。这是在 SWIFT 中,我正在使用 Alamofire。我最近的尝试涉及向 API 搜索方法添加完成处理程序...
func search(keyword: String, location: String, radius: String, completion: () -> ()) {
urlString = self.baseURL + self.KEY + location + radius + keyword
AlamoManager.request(.GET, urlString).responseJSON { response in
if let newJSON = response.result.value, let results = newJSON["results"] {
let newPlaces = results!.valueForKey("name") as! [AnyObject]
for newPlace in newPlaces {
self.cd.saveData(newPlace as! String)
}
print("\nSAVED 1ST BATCH...\n")
if let token = newJSON["next_page_token"] as? String {
let nextPageURL = self.baseURL + self.KEY + "&pagetoken=\(token as! String)"
sleep(3)
self.AlamoManager.request(.GET, nextPageURL).responseJSON { response in
if let newJSON2 = response.result.value , let results = newJSON2["results"] {
let newPlaces2 = results!.valueForKey("name") as! [AnyObject]
for newPlace in newPlaces2 {
self.cd.saveData(newPlace as! String)
}
print("\nSAVED 2ND BATCH...\n")
if let token = newJSON2["next_page_token"] as? String {
let lastPageURL = self.baseURL + self.KEY + "&pagetoken=\(token as! String)"
sleep(3)
self.AlamoManager.request(.GET, lastPageURL).responseJSON { response in
if let newJSON2 = response.result.value, let results = newJSON2["results"] {
var newPlaces3 = results?.valueForKey("name") as! [AnyObject]
for newPlace in newPlaces3 {
self.cd.saveData(newPlace as! String)
}
print("\nSAVED 3RD BATCH...\n")
} else {
print("Didn't get the 3rd JSON.")
}
}
} else {
print("NO MORE PAGES AVAILABLE")
}
} else {
print("Didn't get the second json")
}
}
}
}
completion()
}
}
...然后在 viewDidLoad 中调用加载动画并在完成调用中停止....
override func viewDidLoad() {
super.viewDidLoad()
self.loadingOverlayView.showLoadingOverlay(self.view)
self.gp.search(self.keyword, location: location, radiusInput: "5000", completion: { () -> () in
self.loadingOverlayView.hideLoadingOverlay(self.view)
})
}
问题是加载屏幕在查询结束前被删除了。我该怎么做才能让它只在查询完成后停止?请帮忙。提前致谢。
你的 completion()
调用应该是你打印的地方 "\nSAVED 3RD BATCH...\n"
func search(keyword: String, location: String, radius: String, completion: () -> ()) {
urlString = self.baseURL + self.KEY + location + radius + keyword
AlamoManager.request(.GET, urlString).responseJSON { response in
if let newJSON = response.result.value, let results = newJSON["results"] {
let newPlaces = results!.valueForKey("name") as! [AnyObject]
for newPlace in newPlaces {
self.cd.saveData(newPlace as! String)
}
print("\nSAVED 1ST BATCH...\n")
if let token = newJSON["next_page_token"] as? String {
let nextPageURL = self.baseURL + self.KEY + "&pagetoken=\(token as! String)"
sleep(3)
self.AlamoManager.request(.GET, nextPageURL).responseJSON { response in
if let newJSON2 = response.result.value , let results = newJSON2["results"] {
let newPlaces2 = results!.valueForKey("name") as! [AnyObject]
for newPlace in newPlaces2 {
self.cd.saveData(newPlace as! String)
}
print("\nSAVED 2ND BATCH...\n")
if let token = newJSON2["next_page_token"] as? String {
let lastPageURL = self.baseURL + self.KEY + "&pagetoken=\(token as! String)"
sleep(3)
self.AlamoManager.request(.GET, lastPageURL).responseJSON { response in
if let newJSON2 = response.result.value, let results = newJSON2["results"] {
var newPlaces3 = results?.valueForKey("name") as! [AnyObject]
for newPlace in newPlaces3 {
self.cd.saveData(newPlace as! String)
}
print("\nSAVED 3RD BATCH...\n")
completion() /// <------ HERE
} else {
print("Didn't get the 3rd JSON.")
completion() /// <------ HERE
}
}
} else {
print("NO MORE PAGES AVAILABLE")
completion() /// <------ HERE
}
} else {
print("Didn't get the second json")
completion() /// <------ HERE
}
}
}
} else {
completion() /// <------ HERE
}
}
}
另外,你为什么要添加 sleep(3)
?
我正在尝试弄清楚如何在 运行 查询 API 查询和保存数据时显示加载屏幕。这是在 SWIFT 中,我正在使用 Alamofire。我最近的尝试涉及向 API 搜索方法添加完成处理程序...
func search(keyword: String, location: String, radius: String, completion: () -> ()) {
urlString = self.baseURL + self.KEY + location + radius + keyword
AlamoManager.request(.GET, urlString).responseJSON { response in
if let newJSON = response.result.value, let results = newJSON["results"] {
let newPlaces = results!.valueForKey("name") as! [AnyObject]
for newPlace in newPlaces {
self.cd.saveData(newPlace as! String)
}
print("\nSAVED 1ST BATCH...\n")
if let token = newJSON["next_page_token"] as? String {
let nextPageURL = self.baseURL + self.KEY + "&pagetoken=\(token as! String)"
sleep(3)
self.AlamoManager.request(.GET, nextPageURL).responseJSON { response in
if let newJSON2 = response.result.value , let results = newJSON2["results"] {
let newPlaces2 = results!.valueForKey("name") as! [AnyObject]
for newPlace in newPlaces2 {
self.cd.saveData(newPlace as! String)
}
print("\nSAVED 2ND BATCH...\n")
if let token = newJSON2["next_page_token"] as? String {
let lastPageURL = self.baseURL + self.KEY + "&pagetoken=\(token as! String)"
sleep(3)
self.AlamoManager.request(.GET, lastPageURL).responseJSON { response in
if let newJSON2 = response.result.value, let results = newJSON2["results"] {
var newPlaces3 = results?.valueForKey("name") as! [AnyObject]
for newPlace in newPlaces3 {
self.cd.saveData(newPlace as! String)
}
print("\nSAVED 3RD BATCH...\n")
} else {
print("Didn't get the 3rd JSON.")
}
}
} else {
print("NO MORE PAGES AVAILABLE")
}
} else {
print("Didn't get the second json")
}
}
}
}
completion()
}
}
...然后在 viewDidLoad 中调用加载动画并在完成调用中停止....
override func viewDidLoad() {
super.viewDidLoad()
self.loadingOverlayView.showLoadingOverlay(self.view)
self.gp.search(self.keyword, location: location, radiusInput: "5000", completion: { () -> () in
self.loadingOverlayView.hideLoadingOverlay(self.view)
})
}
问题是加载屏幕在查询结束前被删除了。我该怎么做才能让它只在查询完成后停止?请帮忙。提前致谢。
你的 completion()
调用应该是你打印的地方 "\nSAVED 3RD BATCH...\n"
func search(keyword: String, location: String, radius: String, completion: () -> ()) {
urlString = self.baseURL + self.KEY + location + radius + keyword
AlamoManager.request(.GET, urlString).responseJSON { response in
if let newJSON = response.result.value, let results = newJSON["results"] {
let newPlaces = results!.valueForKey("name") as! [AnyObject]
for newPlace in newPlaces {
self.cd.saveData(newPlace as! String)
}
print("\nSAVED 1ST BATCH...\n")
if let token = newJSON["next_page_token"] as? String {
let nextPageURL = self.baseURL + self.KEY + "&pagetoken=\(token as! String)"
sleep(3)
self.AlamoManager.request(.GET, nextPageURL).responseJSON { response in
if let newJSON2 = response.result.value , let results = newJSON2["results"] {
let newPlaces2 = results!.valueForKey("name") as! [AnyObject]
for newPlace in newPlaces2 {
self.cd.saveData(newPlace as! String)
}
print("\nSAVED 2ND BATCH...\n")
if let token = newJSON2["next_page_token"] as? String {
let lastPageURL = self.baseURL + self.KEY + "&pagetoken=\(token as! String)"
sleep(3)
self.AlamoManager.request(.GET, lastPageURL).responseJSON { response in
if let newJSON2 = response.result.value, let results = newJSON2["results"] {
var newPlaces3 = results?.valueForKey("name") as! [AnyObject]
for newPlace in newPlaces3 {
self.cd.saveData(newPlace as! String)
}
print("\nSAVED 3RD BATCH...\n")
completion() /// <------ HERE
} else {
print("Didn't get the 3rd JSON.")
completion() /// <------ HERE
}
}
} else {
print("NO MORE PAGES AVAILABLE")
completion() /// <------ HERE
}
} else {
print("Didn't get the second json")
completion() /// <------ HERE
}
}
}
} else {
completion() /// <------ HERE
}
}
}
另外,你为什么要添加 sleep(3)
?