2016-09-07 8 views
1

Я пытаюсь реализовать простые функциональные возможности ядра в своем приложении, чтобы он показывал учебник (отдельный контроллер просмотра со страницей прокрутки) только при загрузке приложения и обходит его каждый раз. Я начал с синтаксиса учебных пособий CoreData для Swift 2, но затем должен был настроить на основе автоматических исправлений Swift 3 и других обучающих программ, которые помогли мне преодолеть ошибки, которые я нашел на этом пути (например, SIGBRT). Текущая проблема, с которой я столкнулся, - это ошибка EXC_BAD_INSTRUCTION, для которой мне нужна помощь.Простая выборка в данных Swift 3 Core

У меня 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, бета 8. У меня есть быстрый файл с именем CoreDataStuf.xcdatamodeld, который имеет объект с именем «Лицо» с атрибутом tutorialstatus, который является строкой. Я также дал этому сущности класс Человека. У меня также есть файл 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

Просто FYI метод execute в NSFetchRequest доступен только в iOS 10+. – user3344977

1

Try:

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