2016-09-07 69 views
1

我一直在尝试在我的应用中实现一个简单的核心数据功能,以便它仅在应用第一次加载时显示教程(带有滚动页面的单独视图控制器),以及每隔一段时间绕过它。 我开始使用Swift 2的CoreData教程的语法,但之后必须根据Swift 3的自动更正和其他教程来帮助我克服沿途发现的错误(如SIGBRT)。我遇到的当前问题是EXC_BAD_INSTRUCTION错误,我需要帮助修复。Swift 3核心数据中的简单提取

我有一个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(代码= EXC_1386_INVOP,子码=为0x0)

我正在使用Xcode 8 Beta 8。 我有一个名为CoreDataStuf.xcdatamodeld的swift文件,它有一个名为“Person”的实体,名为tutorialstatus,它是一个字符串。我也给了这个实体一类Person。 我也有一个DataController.swift文件,我指的是URL CoreDataStuf。

+0

本教程提供插入,更新,删除和列表演示在CoreDate中:https://iosdevcenters.blogspot.com/2016/06/crud-operations-using-code-data-swift.html –

+0

放入一些断点看看'moc'和'personFetch'不是零。另外,我认为你的意思是你在运行时得到错误,而不是在编译期间? – Koen

+0

是的,你是正确的 - 我在运行时得到它,而不是编译。 – Fourthdan

回答

2

这是什么工作:

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)") 
     } 
    } 
} 
+0

仅供参考,NSFetchRequest上的执行方法仅适用于iOS 10+。 – user3344977

1

尝试:

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