【问题标题】:Why does my array of NSManagedObjects is losing its properties?为什么我的 NSManagedObjects 数组失去了它的属性?
【发布时间】:2017-07-06 18:10:32
【问题描述】:

在我的 UIViewController 中,我调用另一个类中的一个方法,该方法返回一个 NSManagedObjects 列表,我在一个数组中对其进行实例化。 代码如下:

fileprivate var albumList = [Album]()

private func loadAlbums() {
    APIHandler().getUsersAlbums() {
        albums in
        self.albumList = albums
        self.collectionView?.reloadData()
    }
}

但是一旦 loadAlbums 完成并且 APIHandler 的实例被清除,这会导致我的数组具有 nil 属性。我现在通过在我的 UIViewController 上有一个 APIHandler 实例并从那里调用函数来解决这个问题,如下所示:

let api = SpotifyAPIHandler()
fileprivate var albumList = [Album]()

private func loadAlbums() {
    api.getUsersAlbums() {
        albums in
        self.albumList = albums
        self.collectionView?.reloadData()
    }
}

我仍然对此不满意。为什么会这样? 如何实例化一个全新的列表?

【问题讨论】:

  • NSManagedObjects 是一个类,而不是一个指针。请改写你的问题。如果要基于现有对象创建新的托管对象,则应复制它。详情见:stackoverflow.com/questions/2730832/…
  • 我没有看到您的代码有任何明显的问题。在您的loadAlbums() 完成后,您应该保存所有相册。你的意思是你的数组有 nil 属性?您在 collectionView 中没有看到任何内容吗?你设置了你的 collectionView.dataSource 和 collecitonView.delegate 吗?
  • 我的数组在每个位置都有一个有效的 NSManagedObject,但如果我尝试获取专辑列表[0].name,例如,名称将为 nil
  • 也许只是因为我对 NSManagedObjects 没有太多经验,但我在想这是否不是因为 NSManagedObjectContext 驻留在 SpotifyAPIHandler 中?

标签: ios swift pointers nsmanagedobject


【解决方案1】:

我认为发生的事情是,每次调用 loadAlbums() func 时,您都在创建一个 APIHandler 的新实例,而您可以做的是在您的 APIHander 中添加一个 static 引用APIHander class 就这样

class APIHander: NSObject {
    static let handler = APIHander()
}

然后你会像这样调用你的 API

private func loadAlbums() {
    APIHandler.handler.getUsersAlbums() {
        albums in
        self.albumList = albums
        self.collectionView?.reloadData()
    }
}

【讨论】:

  • 我认为这不是问题,因为它在 loadAlbum() 完成后会被释放 - 每次都会保存数据,所以我认为这很好。
猜你喜欢
  • 1970-01-01
  • 2011-09-30
  • 1970-01-01
  • 1970-01-01
  • 2016-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-12
相关资源
最近更新 更多