Использование данных ядра Alecrim со Swift 3

У меня проблемы с базовыми данными Alecrim в бета-версии Xcode 8. Кажется, что DataContext и DataContextOptions отсутствуют в ветке Swift_3. Хватаясь за соломинку, я только что обновил файлы из основной ветки до синтаксиса Swift3, надеясь, что функциональность не слишком изменилась. Но когда он пытается прочитать данные, я получаю сообщение об ошибке «Невозможно получить без NSManagedObjectContext в области действия». Я провел столько сортировок, сколько смог придумать. Точки останова установлены в месте, которое создает NSManagedObjectContext, и я могу это видеть. Место, где создается fetchRequest, было обновлено новым синтаксисом NSFetchReqeust (хотя я не вижу там признаков MOC).

Вот моя ссылка на Alecrim lib 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
    }

}

Есть ли у кого-нибудь опыт работы с Alecrim в Swift 3, который может помочь понять, что происходит не так?

Спасибо, Майк


person Mike    schedule 05.08.2016    source источник


Ответы (1)


Я нашел ответ, который искал. Я не уверен, что это то, что хочет сделать Alecrim, потому что, как я уже упоминал, ветка swift_3 даже не содержит DataContext или DataContextOptions. Однако... если вы перенесли эти файлы из основной ветки и обновили их до Swift 3, как у меня, и у вас есть проблемы с ошибкой "Не удается получить без MSManagedObjectContext в области", вот как это исправить в файле "TableProtocol. быстрый файл:

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 использует его для вывода RestultType в функции, которая создает NSFetchRequest.

Надеюсь это поможет.

person Mike    schedule 11.08.2016