【问题标题】:Simple Fetch in Swift 3 Core DataSwift 3 核心数据中的简单获取
【发布时间】:2016-09-07 05:10:17
【问题描述】:

我一直在尝试在我的应用程序中实现一个简单的核心数据功能,以便它仅在应用程序第一次加载时显示教程(带有滚动页面的单独视图控制器),并且每隔一次就绕过它。 我从 Swift 2 的 CoreData 教程开始语法,但后来不得不根据 Swift 3 的自动更正和其他帮助我克服在此过程中发现的错误的教程(例如 SIGBRT)进行调整。我目前遇到的问题是 EXC_BAD_INSTRUCTION 错误,我需要帮助解决。

我有一个带有以下代码的 scrollViewController:

class ScrollViewController: UIViewController, NSFetchedResultsControllerDelegate {

@IBOutlet var mainScrollView: UIScrollView!

@IBOutlet weak var endTutorial: UIButton!

var imageArray = [UIImage]()

class Person: NSManagedObject {
    @NSManaged var tutorialstatus: String?
}

func seed() {
    let moc = DataController().managedObjectContext
    let entityDes = NSEntityDescription.entity(forEntityName: "Person", in: moc)
    let entity = Person(entity: entityDes!, insertInto: moc)
    entity.tutorialstatus="test value"
    do {
        try moc.save()
    } catch {
        fatalError("Failure to save context: \(error)")
    }
}

func fetch() {
    let moc = DataController().managedObjectContext
    let personFetch = NSFetchRequest<Person>(entityName: "Person")


    do {
        let fetchedPerson = try moc.fetch(personFetch)
        print(fetchedPerson.first!.tutorialstatus)

    } catch {
        fatalError("Failed to fetch person: \(error)")
    }
}

let fetchedPerson = try moc.fetch(personFetch) 行,当我尝试编译时,我看到错误EXC_BAD_INSTRUCTION (code=EXC_1386_INVOP, subcode=0x0)

我正在使用 Xcode 8,Beta 8。 我有一个名为“CoreDataStuf.xcdatamodeld”的快速文件,它有一个名为“Person”的实体,其属性名为 tutorialstatus,它是一个字符串。我还给该实体一个 Person 类。 我还有一个 DataController.swift 文件,我在其中引用了 URL CoreDataStuf。

【问题讨论】:

  • 本教程在CoreDate中提供插入、更新、删除和列表演示:iosdevcenters.blogspot.com/2016/06/…
  • 放一些断点看看mocpersonFetch是否不为零。另外,我认为您的意思是您在运行时而不是在编译期间收到错误?
  • 是的,你是对的 - 我在运行时得到它而不是编译。
  • 你的应用是基于 tableView 的?
  • Xcode 8 不支持您提供的 fetch 请求。

标签: ios core-data fetch swift3 xcode8-beta6


【解决方案1】:

这是有效的:

let fetchedPerson = try moc.fetch(personFetch as! NSFetchRequest<NSFetchRequestResult>)

【讨论】:

    【解决方案2】:

    尝试像这样在 moc 上下文中进行操作

    @IBOutlet weak var inValue: UITextField!
    let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
    @IBAction func goBtn(_ sender: UIButton) {
        var inVal = Int(inValue.text!)!
        for i in inVal...inVal + 10 {
         context.perform {
             let nums = NSEntityDescription.insertNewObject(forEntityName: "Numbers", into: self.context) as! Numbers
                let request:NSFetchRequest<Numbers> = Numbers.fetchRequest()
                request.predicate = NSPredicate(format: "nums == %d", i)
                do { let numbers =  try? request.execute()
                    if (numbers?.count)! > 0 {
                        print ("Value \(i) alreayd existis")
                    } else {
                        nums.nums = Decimal(i) as NSDecimalNumber?
                    }
                  } catch let error {
                    print ("Error while fetching \(error)")
                }
            }
    
            do {
                try self.context.save()
                print ("Value stored in DB \(i)")
            } catch let error {
                print ("Error while saving \(error)")
            }
        }
    }
    

    【讨论】:

    • 仅供参考,NSFetchRequest 上的执行方法仅适用于 iOS 10+。
    【解决方案3】:

    试试:

        let personFetch = NSFetchRequest<NSFetchRequestResult>(entityName: "Person")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-22
      • 1970-01-01
      • 2011-11-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多