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

Posted

技术标签:

【中文标题】无法在 AppDelegate 应用程序方法的数组中加载 HTTP POST 响应数据。如何解决这个问题?【英文标题】:Unable to load HTTP POST response data in array in AppDelegate application method. How to solve this issue? 【发布时间】:2016-01-03 14:54:06 【问题描述】:

请在 AppDelegate.swift 中找到以下代码 sn-p 我想要实现的是能够使用我自己的 API 收到的图像 url 填充“图像”数组,并进一步将此图像数组迁移到视图控制器(可以使用委托来完成)。 我确实在“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】:

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

这个请求是异步运行的(它应该是异步运行的,因为你不想在检索图像 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!)
    


【讨论】:

以上是关于无法在 AppDelegate 应用程序方法的数组中加载 HTTP POST 响应数据。如何解决这个问题?的主要内容,如果未能解决你的问题,请参考以下文章

无法从 AppDelegate 调用 ViewController 方法

无法识别的选择器发送到数组中的实例[重复]

无法在 AppDelegate 中初始化委托,但在类方法中它可以工作

在 AppDelegate 中使用 ViewController 中的数组

无法从 AppDelegate 访问 NSObject 的公共方法

应用程序委托中的全局变量未保存