2015-06-20 11 views
19

Mam problem z kodem, którego nie mogę wymyślić. Po zainstalowaniu Xcode 7 Beta i przekonwertować mój kod SWIFT Swift 2Swift 2 (executeFetchRequest): obsługa błędów

Kod:

override func viewDidAppear(animated: Bool) { 

    let appDelegate: AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate 

    let context: NSManagedObjectContext = AppDel.managedObjectContext 
    let request = NSFetchRequest(entityName: "PlayerList") 

    list = Context.executeFetchRequest(request) 

    tableView.reloadData() 
} 

Zrzut ekranu:

enter image description here

Odpowiedz

54

Od Swift 2, metody Kakao że błędy produkcyjne są tłumaczone na funkcje Swift, które powodują błąd.

Zamiast opcjonalnej wartości zwracanej i parametr błędu jak w Swift 1.x:

var error : NSError? 
if let result = context.executeFetchRequest(request, error: &error) { 
    // success ... 
    list = result 
} else { 
    // failure 
    println("Fetch failed: \(error!.localizedDescription)") 
} 

w Swift 2 metoda zwraca teraz non-opcjonalne i zgłasza błąd w sprawa błąd, który należy obchodzić się z try-catch:

do { 
    list = try context.executeFetchRequest(request) 
    // success ... 
} catch let error as NSError { 
    // failure 
    print("Fetch failed: \(error.localizedDescription)") 
} 

Aby uzyskać więcej informacji, zobacz "Obsługa błędów" w "Adopting Cocoa Design Patterns" w dokumentacji "Using Swift with Cocoa and Objective-C".

+2

A jeśli próbują wykorzystać tablicę wypełnioną wartościami niestandardowymi, twój pobrać wiersz będzie wyglądał tak ... 'pomysły = spróbować self.managedObjectContext! .executeFetchRequest (fetchRequest) jak! [Pomysły] ' – justColbs

+0

Jeśli mam tylko instancję' list', a nie tablicę, jak mam to zrobić? – jo3birdtalk

+0

@ jo3birdtalk: executeFetchRequest() zawsze zwraca tablicę. Jeśli istnieje tylko jedno wystąpienie, możesz uzyskać do niego dostęp, np. przez 'list [0]' lub 'list.first'. –

1
var results = [YourEntity]? 
results = try! self.managedObjectContext!.executeFetchRequest(fetchRequest) as! [YourEntity] 
+0

Witam, jeśli nie mam tablicy 'YourEntity', ale tylko jej przykładu, jak to zrobić? Próbowałem bez nawiasów klamrowych, ciągle podpowiada mi, że nie można przekonwertować AnyObject na typ 'User' – jo3birdtalk

+0

@ jo3birdtalk Po prostu pozwól myResult = results? .first. Jeśli wiesz, że twoja prośba o pobranie powinna zwrócić tylko jeden obiekt, możesz go uzyskać. – Macondo2Seattle

4

Można wypróbować ten kod:

let result = (try! self.manageContext.executeFetchRequest(FetchRequest)) as! [NSManageObjectClass] 
1

Spróbuj poniższy kod

override func viewWillAppear(animated: Bool) { 

     let appDel:AppDelegate = (UIApplication.sharedApplication().delegate as! AppDelegate) 
     let context = appDel.managedObjectContext 
     let request = NSFetchRequest(entityName:"Users") 
     do { 
      let results = try context.executeFetchRequest(request) 

      itemList = results as! [NSManagedObject] 


     } catch let error as NSError { 
      print("Could not fetch \(error), \(error.userInfo)") 
     } 


    } 
+0

Ogólnie zalecam dodanie krótkiego opisu oprócz kodu, który publikujesz. (Tak więc, na przykład, gdyby wystąpił błąd literowy lub gdyby ludzie nie mieli okazji, aby wypróbować go bezpośrednio, ludzie mogą łatwo uzyskać ten punkt). –

3

Swift 3.0 W tym przykładzie PlayerList jest NSManagedObject jednostka/nazwa klasy (auto stworzone przez Xcode)

let request: NSFetchRequest<PlayerList> = PlayerList.fetchRequest() 

var result:[PlayerList]? 
do{ 
     //Succes 
     result = try context.fetch(request) 
    }catch let error as NSError { 
     //Error 
     print("Error \(error)") 
    } 

print("result: \(result)")