2016-09-07 61 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")