NSManagedObject如何符合NSItemProviderReading协议?

时间:2017-07-31 23:49:36

标签: swift core-data drag-and-drop ios11 swift4

在创建Core Data实体的NSManagedObject子类之后,如何使其与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:)真的是走这条路的正确方法吗?

1 个答案:

答案 0 :(得分:0)

要符合NSItemProviderReading协议要求符合您提到的init以及静态变量readableTypeIdentifiersForItemProvider

init(itemProviderData: Data, typeIdentifier: String)

static var readableTypeIdentifiersForItemProvider: [String]

documentation表示必需注释。

我没有看到你的init有任何问题,所以如果它编译并使用你计划如何使用这个课我没有看到问题。我建议使用依赖注入将整个应用程序中的Core Data上下文传递给需要它们的视图控制器。这样你就不必每次都做烦人的AppDelegate代码(而且它更安全,因为你可以确保上下文始终可用)。