Как NSManagedObject может соответствовать протоколу NSItemProviderReading?

После создания подкласса NSManagedObject объекта Core Data, как я могу привести его в соответствие с протоколом NSItemProviderReading? Протокол имеет обязательный инициализатор, который должен быть объявлен непосредственно в классе. Но какой назначенный инициализатор должен вызывать NSItemProviderReading init(itemProviderData:, typeIdentifier:)?

Вот что у меня ниже:

import Foundation
import CoreData

@objc(Something)
public class Something: NSManagedObject, NSItemProviderReading {

    public override init(entity: NSEntityDescription, insertInto context: NSManagedObjectContext?) {
        super.init(entity: entity, insertInto: context)
    }

    // MARK: - Item Provider Reading 

    public static var readableTypeIdentifiersForItemProvider: [String] {
        return []
    }

    public required init(itemProviderData data: Data, typeIdentifier: String) throws {
        // This seems very hack-y…
        let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
        self.init(context: context)
    }
}

Звонить self.init(context:) действительно правильно?


person Lucas    schedule 31.07.2017    source источник


Ответы (1)


Для соответствия протоколу NSItemProviderReading требуется соответствие упомянутому вами init, а также статической переменной readableTypeIdentifiersForItemProvider:

init(itemProviderData: Data, typeIdentifier: String)

static var readableTypeIdentifiersForItemProvider: [String]

В документации это указано с примечанием Обязательно.

Я не вижу ничего плохого в вашем init, поэтому, если он компилируется и работает с тем, как вы планируете использовать класс, я не вижу проблемы. Я бы порекомендовал использовать внедрение зависимостей для передачи контекста Core Data через ваше приложение тем контроллерам представлений, которые в них нуждаются. Таким образом, вам не нужно каждый раз выполнять раздражающий код AppDelegate (и это безопаснее, поскольку вы можете быть уверены, что контекст всегда доступен).

person Paolo    schedule 01.08.2017