2017-12-14 1 views
0

Ich bekomme diese seltsame Warnung "Verwendung von nicht aufgelösten Bezeichnern", obwohl ich die Variable in der Zeile oben deklariere.NSFetchedResultsController nicht aufgelöster Bezeichner Swift 4

Was passiert hier? Hier ist mein Code:

var fetchedResultsController: NSFetchedResultsController<Project> { 

    if _fetchedResultsController != nil { 
     return _fetchedResultsController 
    } 

    let fetchRequest: NSFetchRequest<Project> = Project.fetchRequest() 

    fetchRequest.fetchBatchSize = 20 

    let sortDescriptor = NSSortDescriptor(key: "name", ascending: false) 

    fetchRequest.sortDescriptors = [sortDescriptor] 

    let aFetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: self.managedObjectContext!, sectionNameKeyPath: nil, cacheName: "Master") 
    aFetchedResultsController.delegate = self 
    _fetchedResultsController = aFetchedResultsController 

    do { 
     try _fetchedResultsController.performFetch() 
    } catch { 
     // Replace this implementation with code to handle the error appropriately. 
     // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 
     //println("Unresolved error \(error), \(error.userInfo)") 
     abort() 
    } 

    return _fetchedResultsController! 
} 

und hier ist der Code von einem Apple-Template-Projekt, das keine Warnungen oder Fehler hat:

var fetchedResultsController: NSFetchedResultsController<Event> { 

    if _fetchedResultsController != nil { 
     return _fetchedResultsController! 
    } 

    let fetchRequest: NSFetchRequest<Event> = Event.fetchRequest() 

    // Set the batch size to a suitable number. 
    fetchRequest.fetchBatchSize = 20 

    // Edit the sort key as appropriate. 
    let sortDescriptor = NSSortDescriptor(key: "timestamp", ascending: false) 

    fetchRequest.sortDescriptors = [sortDescriptor] 

    // Edit the section name key path and cache name if appropriate. 
    // nil for section name key path means "no sections". 
    let aFetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: self.managedObjectContext!, sectionNameKeyPath: nil, cacheName: "Master") 
    aFetchedResultsController.delegate = self 
    _fetchedResultsController = aFetchedResultsController 

    do { 
     try _fetchedResultsController!.performFetch() 
    } catch { 
     // Replace this implementation with code to handle the error appropriately. 
     // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 
     let nserror = error as NSError 
     fatalError("Unresolved error \(nserror), \(nserror.userInfo)") 
    } 

    return _fetchedResultsController! 
}  

Ich begann mich zu denken, dass es etwas mit dem zu tun haben könnte, CoreData-Entität (Klasse), die ich erstellt habe (Projekt). Obwohl es sich um eine einfache Entität mit einem Attribut (Name) handelt, hat das Vorlagenprojekt auch eine Entität (Ereignis) mit einem Attribut (timeStamp).

Meine "Tools Version" der CoreData ist auf Automatisch (XCode 9.0) eingestellt und die "Code Generation" ist auf Swift eingestellt.

Eine andere Sache, die ich bemerke ist, dass XCode manchmal meine Entität (Projekt) nicht erkennt und ich neu starten muss, um dieses Problem zu lösen.

Ist XCode 9 mit CoreData fehlerhaft?

+0

Dont schreiben das Bild nicht geben Sie bitte poste den Code. Schließlich, selbst wenn das kompiliert wird, werden Sie in die Endlosschleife eintreten, indem Sie auf die Eigenschaft in ihrem Getter zugreifen. Willst du zufällig versuchen, faule var zu implementieren? –

+0

Ich wollte den Code posten, aber die Warnungen wurden nicht angezeigt, damit mein Problem nicht korrekt angezeigt wird. – BillySangster

+0

Sie können den Code und den Fehler eingeben, den Sie unten eingeben können. Wir können Ihren Code nicht kopieren und in unseren Arbeitsbereich einfügen, um zu überprüfen, was in Ihrem Code falsch ist, wenn Sie das Bild hochladen :) –

Antwort

1

Es sieht so aus, als ob Sie versuchen, eine Singleton-Instanz von NSFetchedResultsController zu erstellen oder NSFetchedResultsController nur einmal zu initialisieren.

Probleme:

die Eigenschaft Zugriff direkt in seinem Getter wird Endlosschleife und App führt zum Absturz bringen.

Lösung:

Wahrscheinlich alles, was Sie brauchen, ist lazy variable

lazy var fetchedResultsController : NSFetchedResultsController<Project> = { 
    let localFetchedResultsController : NSFetchedResultsController<Project> = //initialize your fetched results controller 
    return localFetchedResultsController 
}() 

Dadurch wird sichergestellt, die fetchedResultsController nur einmal initialisiert werden und zurück die gleiche Instanz wieder n wieder. Es sei denn, Sie absichtlich die Instanz selbst durch

self.fetchedResultsController = //some_new_fetchedResultsController_instance 

Hoffnung ut Aufruf ändern hilft

EDIT 1:

Warum Sie einen Versuch zu

lazy var fetchedResultsController : NSFetchedResultsController<Project> = { 
     let fetchRequest: NSFetchRequest<Project> = Project.fetchRequest() 
     fetchRequest.fetchBatchSize = 20 
     let sortDescriptor = NSSortDescriptor(key: "name", ascending: false) 
     fetchRequest.sortDescriptors = [sortDescriptor] 

     let aFetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: self.managedObjectContext!, sectionNameKeyPath: nil, cacheName: "Master") 
     aFetchedResultsController.delegate = self 

     do { 
      try aFetchedResultsController.performFetch() 
     } catch { 
      // Replace this implementation with code to handle the error appropriately. 
      // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 
      //println("Unresolved error \(error), \(error.userInfo)") 
      abort() 
     } 

     return aFetchedResultsController! 
    }() 
+0

Danke dafür, @Sandeep Bhandari. Ihre Lösung sieht sauberer aus als die im Apple-Code, ich werde wahrscheinlich meine ändern. :) – BillySangster

+0

@billysangster: Bitte bedenke, die Antwort zu akzeptieren, wenn es geholfen hat :) –

Verwandte Themen