Spritekit und Core Data und was bedeutet: Instance member cannot be used?

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • Spritekit und Core Data und was bedeutet: Instance member cannot be used?

      Hallo Alle zusammen,

      ich nutze Core Data und Spritekit (was ja von Hause aus nicht unbedingt vorgesehen ist) und habe irgendwie die Befürchtung, dass beides aus irgendeinem Grund nicht zusammen passt.
      Schon beim Import von Core Data, zeigt mir Xcode in der Vorschlagebox CoreData als durchgestrichen an. Long Story short: zur meiner ersten Frage, wieso ist CoreData bei der Verwendung von SpriteKit nicht vorgesehen bzw. gibt es Gründe, weshalb man beides zusammen nicht verwenden sollte?

      Zu meiner zweiten Frage:
      Wie gesagt, ich versuche es trotzdem, bekomme aber immer wieder die Meldung "Instance member cannot be used on Type Gameviewcontroller".
      Habe hier mal ein kleines Beispiel

      Quellcode

      1. import UIKit
      2. import SpriteKit
      3. import CoreData
      4. class GameViewController: UIViewController {
      5. var appDel: AppDelegate = (UIApplication.sharedApplication().delegate as! AppDelegate)
      6. var context: NSManagedObjectContext = appDel.managedObjectContext //instance member appDel cannot be used on type GameViewController
      7. }
      Woran kann das liegen?

      Vielen Dank in jedem Fall
      Krusel
    • Krusel schrieb:

      ich nutze Core Data und Spritekit (was ja von Hause aus nicht unbedingt vorgesehen ist) und habe irgendwie die Befürchtung, dass beides aus irgendeinem Grund nicht zusammen passt.
      Warum sollte das der Fall sein? Das eine hat ja mit dem Anderen überhaupt nichts zu tun.
      Du solltest zwar Deine Assets nicht in Core Data propfen und für Highscores, Herausforderungen etc.pp. lieber die Möglichkeiten von GameKit nutzen und ich weiß auch nicht so recht, wofür Du in einem Spiel mehrere komplexe Objektgraphen benötigst, aber wenn der Anwendungsfall das her gibt ist diese Kombination schon möglich.
      (Im Übrigen glaube ich nicht, dass Du dafür einen sinnvollen Anwendungsfall hast. Apple glaubt das offenbar auch nicht und mag wohl deshalb nicht SpriteKit und CoreData zusammenwerfen.)

      Zu Deinem Problem: Weit bevor Du irgendwas instanziierst greifst Du schon auf eine Instanzvariable Deines App Delegates zu.
      Du hast zur Compilezeit aber noch gar kein App Delegate. Also kann `managedObjectContext` nicht gelesen werden und ist `null`.
      Der Aufruf wäre also `null.managedObjectContext` und Swift mag sowas nun aber überhaupt nicht. Zur Compilezeit `null` und zur Laufzeit dann eventuell was Anderes, dass missfällt den Compilerbauern um President Business.
      (Wer 'The Lego Movie' nicht gesehen hat wird diesen Querverweis nicht verstehen. :P)

      Überhaupt war das nachträgliche Einbauen von Core Data in Non-Core-Data-Vorlagen schon unter Objective-C eine Katastrophe, ich will gar nicht wissen, wie das in Swift aussehen soll.

      Wie dem auch sei, die Warnung wirst Du los in dem Du nicht auf die uninstanziierte Instanzvariable 'appDel.managedObjectContext' zuweist, welche übrigens einen unvorteilhaften Namen hat, sondern 'UIApplication.sharedApplication().delegate.managedObjectContext as! ManagedObjectContext'

      Das umgeht allerdings in keinster Weise das von macmoonshine angesprochene Problem.
      Vor Allem im Hinblick auf die Tatsache, dass ManagedObjectContext niemals `null` sein darf, führt das im weiteren Verlauf zu lustigen Irrungen und Wirrungen.

      Bist Du Dir also wirklich sicher, dass Du SpriteKit und CoreData sinnvoll nebenher benutzen willst (bedenke, dass CoreData von Haus aus nicht threadsafe ist, Du für Speicheraktionen aber sicherlich nicht das Game lahm legen willst!), lass Dir Vorlagen für Core Data und SpriteKit generieren und baue daraus dann ein Grundkonstrukt, das beides vernünftig vereint.
      «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

      Iä-86! Iä-64! Awavauatsh fthagn!

      kmr schrieb:

      Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P