无法在AppDelegate应用程序方法中加载数组中的HTTP POST响应数据。如何解决这个问题?

时间:2016-01-03 14:54:07

标签: ios swift swift2 alamofire appdelegate

请在AppDelegate.swift中找到以下代码段 我想要实现的是能够使用我自己的API使用图像URL填充'images'数组,并进一步将此图像数组迁移到视图控制器(可以使用委托完成)。 我在“print(self.images [index])”中获得了图片网址列表,但是“images.isEmpty”返回true。我哪里错了?

示例控制台输出:

2016-01-03 19:28:48.767 Mobblr [22372:1347546] Interface Builder文件中的未知类ContentViewContr。
这里显示的图像URL列表

var images = [String]()    
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

    preloadData()
    print(images.isEmpty)

    var pageControl = UIPageControl.appearance()
    pageControl.pageIndicatorTintColor = UIColor.lightGrayColor()
    pageControl.currentPageIndicatorTintColor = UIColor.blackColor()
    pageControl.backgroundColor = UIColor.whiteColor()
    return true
}

func preloadData() {
    let parameters = ["count": 100]
    Alamofire.request(.POST, <My API>, parameters: parameters, encoding: .JSON)
        .responseJSON { response in
            if let value: AnyObject = response.result.value {

                let posts = JSON(value)
                //print(posts)
                for index in 0..<posts.count {
                    //print(posts[index]["image_url"])
                    if let image = posts[index]["image_url"].string {
                        self.images += [image]
                        print(self.images[index])

                    } else {
                        self.images += [""]
                    }
                }

    }

}

1 个答案:

答案 0 :(得分:0)

你说“images.isEmpty返回true”。你在哪里/什么时候检查?

此请求以异步方式运行(并且它应该,因为您不想在检索图像URL时阻止您的应用程序),因此想要使用images的视图控制器很可能正在检查请求已完成。所以问题是当成功检索images时,如何通知视图控制器(或等待images填充的任何内容)。

您可以使用此通知。因此,responseJSON完成块可以发布通知:

Alamofire.request(.POST, <My API>, parameters: parameters, encoding: .JSON)
    .responseJSON { response in
        // process the response here

        // now post notification

        NSNotificationCenter.defaultCenter().postNotificationName(imagesNotificationKey, object: nil)
}

这假设您有一些全局性是此通知的关键:

let imagesNotificationKey = "..."

任何想要在收到此通知后采取某些行动的视图控制器都可以将自己添加为观察者:

class ViewController: UIViewController {

    var observer: NSObjectProtocol?

    override func viewDidLoad() {
        super.viewDidLoad()

        observer = NSNotificationCenter.defaultCenter().addObserverForName(imagesNotificationKey, object: nil, queue: NSOperationQueue.mainQueue()) { notification in
            // do something (e.g. reload table or what have you)
        }
    }

    deinit {
        NSNotificationCenter.defaultCenter().removeObserver(observer!)
    }

}