Ios 当它被称为Swift 2时,继续返回一个空数组
我试图将vidar附加到videoArray中,但它只能在Alamofire块中使用。当我试图得到它的计数端时,我得到了一个返回值0,但在Ios 当它被称为Swift 2时,继续返回一个空数组,ios,arrays,swift,swift2,Ios,Arrays,Swift,Swift2,我试图将vidar附加到videoArray中,但它只能在Alamofire块中使用。当我试图得到它的计数端时,我得到了一个返回值0,但在Alamofire块的一侧,我得到了返回值5。我猜这和范围有关吧?我正在调用我的viewDidLoad中的函数getFeedVideos() let APIKey = "AIzaSyBF1fGTvY4Z73jNBRFlxiSDelt4zqMnNCg" var videoArray = [VideoObj]() // main function func ge
Alamofire
块的一侧,我得到了返回值5。我猜这和范围有关吧?我正在调用我的viewDidLoad
中的函数getFeedVideos()
let APIKey = "AIzaSyBF1fGTvY4Z73jNBRFlxiSDelt4zqMnNCg"
var videoArray = [VideoObj]()
// main function
func getFeedVideos (){
// Fetch video data
Alamofire.request(.GET, "https://www.googleapis.com/youtube/v3/playlistItems", parameters: ["part":"snippet", "playlistId": "PL8kma_GjQgWzBLAciqmwC4duAPcSRyt8T", "key":APIKey], encoding: ParameterEncoding.URL, headers: nil).responseJSON { (response) -> Void in
var vidar = [VideoObj]()
if let value = response.result.value {
var arrayofvideos = [VideoObj]()
// loop
for videos in value["items"] as! NSArray {
let videoObject = VideoObj()
videoObject.videoID = videos.valueForKeyPath("snippet.resourceId.videoId") as! String
videoObject.videoTitle = videos.valueForKeyPath("snippet.title") as! String
videoObject.videoDescription = videos.valueForKeyPath("snippet.description") as! String
videoObject.vidoeoThumbUrl = videos.valueForKeyPath("snippet.thumbnails.maxres.url") as! String
arrayofvideos.append(videoObject)
} // For loop ends
//print(arrayofvideos.count) // Prints out 5, which is correct
//print(arrayofvideos[0].videoTitle) // Prints out video title
// P A R S E print("JSON: \(value)")
//
vidar = arrayofvideos
} // If Statement ends
print(vidar.count) // prints 5
self.videoArray = vidar
print(self.videoArray) // prints array
} // AlamoFire Ends
// ** Anything in there returns 0 ** //
print("\(videoArray.count) count ") // But this array prints out 0 !?!?
//print(arrayofvideos[0].videoTitle) // No title "fatal error: Array index out of range"
} // Function End
是的,这与变量的范围有关。
videoArray
的范围是getFeedsVideos()
函数的本地范围。vidar的情况也是如此。要增加这些变量的范围,您可以通过在类的顶部声明它们来将它们移动到实例级别。仅此一点并不能解决他的问题.request
是异步执行的,调用.request
后的打印等是在实际执行请求之前执行的。谢谢@DavidBerry。如果他同步执行该请求,其他所有线程(所有线程)会等到请求返回后再继续吗?他不应该在viewDidLoad中执行同步网络操作,而且,我不确定Alamofire是否可以同步使用。最好只看另外98个问题中的一个,问同样的问题。Alamofire不能同步使用(如果没有广泛的黑客攻击)。@AaronBrager你不需要只为特定的请求进行黑客攻击,一个简单的旧信号灯就足够了:)我可以不断找到重复的,但问题的核心是,.request
是一个异步操作,这意味着在例程返回后的某段时间内(相当长?)结果才可用。@DavidBerry感谢找到这些重复项。