将 Alecrim 核心数据与 Swift 一起使用 3

Using Alecrim Core Data with Swift 3

我在使用 Xcode 8 Beta 中的 Alecrim Core Data 时遇到问题。 Swift_3 分支中似乎缺少 DataContext 和 DataContextOptions。抓紧时间,我刚刚将主分支的文件更新为 Swift3 语法,希望功能没有太大变化。但是当它尝试读取数据时,我收到一条错误消息 "Cannot fetch without an NSManagedObjectContext in scope"。 我已经做了尽可能多的分类。在创建 NSManagedObjectContext 的位置设置断点,我可以看到它。创建 fetchRequest 的地方已更新为新的 NSFetchReqeust 语法(尽管我在那里没有看到 MOC 的迹象)。

这是我的 link 到 Alecrim 库 DataContext 中:

let dataContext = DataContext()

extension DataContext
{
    public var collections: Table<CoreDataCollection> { return Table<CoreDataCollection>(context: self) }
    public var expressions: Table<CoreDataExpression> { return Table<CoreDataExpression>(context: self) }
    public var fileAssets: Table<CoreDataFileAsset> { return Table<CoreDataFileAsset>(context: self) }
    public var purchases: Table<CoreDataPurchase> { return Table<CoreDataPurchase>(context: self) }
    public var reeConfigs: Table<CoreDataReeConfig> { return Table<CoreDataReeConfig>(context: self) }
    public var stickers: Table<CoreDataSticker> { return Table<CoreDataSticker>(context: self) }

}

以及尝试获取数据的部分:

for item in dataContext.reeConfigs {
    let reeConfigVO = ReeConfigVO()
    reeConfigVO.initFromCoreData(item)
    items.append(reeConfigVO)
}

我不确定这是否有帮助,但 Alecrim 的部分抛出错误:

// MARK: - GenericQueryable

extension TableProtocol {

    public final func execute() -> [Self.Element] {
        do {
            return try self.toFetchRequest().execute() as [Self.Element]
        }
        catch let error {
            AlecrimCoreDataError.handleError(error)
        }
    }

}

// MARK: - CoreDataQueryable

extension TableProtocol {

    public final func toFetchRequest<ResultType: NSFetchRequestResult>() -> NSFetchRequest<ResultType> {
        let fetchRequest = NSFetchRequest<ResultType>()

        fetchRequest.entity = self.entityDescription

        fetchRequest.fetchOffset = self.offset
        fetchRequest.fetchLimit = self.limit
        fetchRequest.fetchBatchSize = (self.limit > 0 && self.batchSize > self.limit ? 0 : self.batchSize)

        fetchRequest.predicate = self.predicate
        fetchRequest.sortDescriptors = self.sortDescriptors

        return fetchRequest
    }

}

有没有人在 Swift 3 中使用过 Alecrim 可以帮助找出问题所在?

谢谢, 麦克

我找到了我要找的答案。我不确定这是 Alecrim 想要完成的,因为正如我提到的,swift_3 分支甚至不包含 DataContext 或 DataContextOptions。但是...如果您像我一样从主分支中引入了这些文件并将它们更新为 swift 3 并且您遇到错误 "Cannot fetch without an MSManagedObjectContext in scope" 的问题,这是在 [=18 中修复它的方法=] 文件:

extension TableProtocol {

    public final func execute() -> [Self.Element] {
        do {
            return try self.context.fetch(self.toFetchRequest()) as! [Self.Element]
            //return try self.toFetchRequest().execute() as [Self.Element]
        }
        catch let error {
            AlecrimCoreDataError.handleError(error)
        }
    }
}

self.context 是它工作所需的 NSManagedObjectContext(或派生类型,即我们的 DataContext)。作为! [Self.Element] 至关重要,因为 Swift 使用它来推断构建 NSFetchRequest

的函数中的 RestultType

希望对您有所帮助。