使用 Swift 和 xcode 追加后,数组中没有数据

Posted

技术标签:

【中文标题】使用 Swift 和 xcode 追加后,数组中没有数据【英文标题】:No Data in Array after appending using Swift and xcode 【发布时间】:2016-02-02 09:29:35 【问题描述】:

我正在尝试从 url 下载图像,然后将它们保存在 NSData 数组中。

我有一个名为 Data Manager 的类,其中存储了我的所有数据以及下载图像和从 URL 获取数据的功能。

在同一个类中,我声明了一个名为 imageData 的变量,类型为 [NSData],并让它等于一个空数组,如下所示:

   var imageData: [NSData] = []

这是我的其他 2 个函数的样子:

func getDataFromUrl(url:NSURL, completion: ((data: NSData?, response: NSURLResponse?, error: NSError? ) -> Void)) 
NSURLSession.sharedSession().dataTaskWithURL(url)  (data, response, error) in
completion(data: data, response: response, error: error)
.resume()


func downloadImage(url: NSURL)
    print("Download Started")
    print("lastPathComponent: " + (url.lastPathComponent ?? ""))
    getDataFromUrl(url)  (data, response, error)  in
        dispatch_async(dispatch_get_main_queue())  () -> Void in
            guard let data = data where error == nil else  return 
            print(response?.suggestedFilename ?? "")
            print("Download Finished")
            self.imageData.append(data)
            print("you have \(self.imageData.count)")
        
        print("you still do have \(self.imageData.count)")
    

我在我的应用程序 Delegate 类中的函数 didFinishLaunchingWithOptions 下调用这些函数

let dataManager = DataManager()
func application(application: UIApplication, didFinishLaunchingWithOptions      launchOptions: [NSObject: AnyObject]?) -> Bool 
    // Override point for customization after application launch.

    dataManager.URLStringArray.removeAll()

  for url in dataManager.objects.imageURLS 
dataManager.URLStringArray.append(url)
  
    for url in dataManager.URLStringArray    
    dataManager.downloadImage(NSURL(string: url)!)
    print(url)
    

return true

在我的视图控制器中,我通过以下函数获取图像数组中的数据:

func returnImageData() -> [NSData] 
    print("your image count is \(imageData.count))")
    return imageData

但是数组是空的!尽管在整个过程中我注意到数组变得越来越大,因为打印到日志中显示数组正在增加!

谢谢!

【问题讨论】:

这段摘录中有self.imageDataself.ImageData,我希望在你的真实代码中不是这样,这可能是问题所在。 didFinishLaunchingWithOptions 中,如果您从URLStringArray 中删除所有项目,则将跳过以下重复循环。 “imageData”和“ImageData”是错别字,在我的代码中都是一样的 @vadian ,在循环开始之前调用 remove all items,一旦循环开始并且 URLS 被附加它就永远不会被调用。 这令人困惑。从URLStringArray 中删除所有项目后,没有什么可枚举的。 【参考方案1】:

由于您使用异步调用来下载图像数据,因此在您打印 imageData 的计数时,图像尚未下载,因此尚未填充数组。当然,这是假设您使用了 Eric.D 指出的正确属性名称。

【讨论】:

图像数据的数量正在打印到日志中并且正在增加。但是,当我进入我的视图控制器并调用该方法以获取视图中的数组时确实加载了,然后尝试填充该数组,但它显示为一个空数组。我尝试了很多不同的方法来获取这些数据,但它总是以一个空数组结束! returnImageData() 在 ViewController 中,对吗? ViewController 中是否也有一个 imageData 数组。它不应该返回dataManager.imageData 问题是我需要在我的单例实例中创建一个变量,然后将图像附加到该变量并检索它 如果你的 dataManager 是一个单例,并且没有在其他地方创建它的实例,那么你可以使用它,就像我之前在评论中提到的那样。

以上是关于使用 Swift 和 xcode 追加后,数组中没有数据的主要内容,如果未能解决你的问题,请参考以下文章

如果不存在,则追加对象 swift

Swift数组追加不适用于collectionView重新加载数据

在 Swift 中,追加数组的效率如何?

Swift:“在展开可选值时意外发现 nil”在数组追加中

数组追加在 Swift 上不起作用

UICollectionview 将数据追加到数组 Swift