API JSON&UIPageViewController可选无

好吧,我正在试图找出一个pageview滑块,它使用本教程作为基础从API中检索图像url。

我已经编码图像的asynchronous下载并将其附加到pageImages数组。 这部分工作正常。

但是,当我尝试在模拟器中运行应用程序时,收到错误消息:

致命错误:意外地发现零,而解包一个可选值

出于某种原因,在调用我的帮助器方法viewControllerAtIndex后,获取JSON对象并填充pageImages数组。

我的代码

class ViewController: UIViewController, UIPageViewControllerDataSource { var pageViewController: UIPageViewController! var pageImages = NSArray() var jsonData = NSArray() override func viewDidLoad() { super.viewDidLoad() ###THIS EXECUTES AFTER MY HELPER METHOD viewControllerAtIndex self.fetchPublishers() self.pageViewController = self.storyboard?.instantiateViewControllerWithIdentifier("PageViewController") as! UIPageViewController self.pageViewController.dataSource = self var startVC = self.viewControllerAtIndex(0) as ContentViewController var viewControllers = NSArray(object: startVC) self.pageViewController.setViewControllers(viewControllers as [AnyObject], direction: .Forward, animated: true, completion: nil) self.pageViewController.view.frame = CGRectMake(0, 30, self.view.frame.width, self.view.frame.size.height) self.addChildViewController(self.pageViewController) self.view.addSubview(self.pageViewController.view) self.pageViewController.didMoveToParentViewController(self) } func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? { var vc = viewController as! ContentViewController var index = vc.pageIndex as Int if (index == 0 || index == NSNotFound) { return nil } index-- return self.viewControllerAtIndex(index) } func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? { var vc = viewController as! ContentViewController var index = vc.pageIndex as Int if (index == NSNotFound) { return nil } index++ if (index == self.pageImages.count) { return nil } return self.viewControllerAtIndex(index) } func viewControllerAtIndex(index: Int) -> ContentViewController { if ((self.pageImages.count == 0) || (index >= self.pageImages.count)) { return ContentViewController() } var vc: ContentViewController = self.storyboard?.instantiateViewControllerWithIdentifier("ContentViewController") as! ContentViewController vc.imageFile = self.pageImages[index] as! String vc.pageIndex = index return vc } func presentationCountForPageViewController(pageViewController: UIPageViewController) -> Int { return self.pageImages.count } func presentationIndexForPageViewController(pageViewController: UIPageViewController) -> Int { return 0 } func fetchPublishers () { var req:Request = Alamofire.request(OauthToken.Router.ReadPublishers("")) var aClosure = {(req:NSURLRequest, response:NSHTTPURLResponse?, JSON:AnyObject?, error:NSError?) -> Void in if (error != nil) { println(error) println("Couldn't connection to server.") } else { dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)) { self.jsonData = JSON as! NSArray! var baseUrl: String = "http://0.0.0.0:3000" self.pageImages = JSON!.valueForKey("photo_url") as! NSArray! ###Prints/executes after println(self.pageImages) } } } req.responseJSON(aClosure) } } 

ContentViewController

 class ContentViewController: UIViewController { @IBOutlet weak var imageView: UIImageView! var pageIndex: Int! var imageFile: String! override func viewDidLoad() { super.viewDidLoad() ####THE ERROR HAPPENS HERE self.imageView.image = UIImage(named: self.imageFile) } } 

我怎样才能解决这个问题?

事情发生的顺序不正确,因为引用AlamoFire github页面 :“Alamofire的联网是asynchronous完成的。 这意味着在从服务器收到响应之前,不会执行aClosure中的代码,而是执行viewDidLoad

结果是,当通过调用viewControllerAtIndex设置viewControllerAtIndex ,pageImages数组为空,并且return ContentViewController()被执行。 这实例化一个空的内容视图控制器,因为它没有链接到故事板,出口imageFile是零(和imageFile实际上是零)。 这就是你得到错误的原因。

所以你需要修改viewControllerAtIndex中的if语句,以便在数组为空的时候显示更有用的信息 – 可能是一个视图控制器,它向用户提供数据正在下载的消息,以及系统正在工作的可视化指示器。

当数据从服务器到达时,您必须find重新加载页面视图控制器的方法。 要做到这一点,你应该在你的aClosure的最后添加一些代码。 在教程中,有一个函数restartAction ,它执行必要的操作,所以调用它,或者将代码复制到闭包中。

最后,因为最后一步涉及UI更新,所以必须在主队列上运行。 所以你需要修改你的dispatch_async调用(在闭包中)来使用主队列,而不是全局队列。 看到这个答案的完整解释。