Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/110.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 当它被称为Swift 2时,继续返回一个空数组_Ios_Arrays_Swift_Swift2 - Fatal编程技术网

Ios 当它被称为Swift 2时,继续返回一个空数组

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

我试图将vidar附加到videoArray中,但它只能在Alamofire块中使用。当我试图得到它的计数端时,我得到了一个返回值0,但在
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感谢找到这些重复项。