0

Ich versuche, alle Daten von Parse zu erhalten und diese Daten mit den Core-Daten von meinem Telefon zu synchronisieren. Ich habe momentan ein kleines Problem mit einer Abrufanforderung, die nicht korrekt ausgeführt wird. Ich denke die Ursache ist, dass ich den managedObjectContext für verschiedene Aufgaben verwende, aber ich weiß nicht wirklich, wie ich das beheben kann.Fehler beim Abrufen von Objekten in den Core-Daten "- [__ NSArrayI-Entität]: nicht erkannter Selektor an Instanz gesendet"

Ich zeige deutlich in meinem Code, wo das Problem auftritt. Und es ist ziemlich seltsam, weil mein Code nicht abstürzt, aber es nur einen Fehler in das Protokoll druckt. (Ich habe die Ergebnisse, über die Log-Anzeige direkt unter dem Code)

Dies ist mein Code:

// CORE DATA UPDATE 

for var i = 0; i < self.messages.count; i++ { 
let entity = NSEntityDescription.entityForName("Groups", inManagedObjectContext: self.managedObjectContext) 
let newGroup = Groups(entity: entity!, insertIntoManagedObjectContext: self.managedObjectContext) 

newGroup.groupId = self.messages[i].groupId 
newGroup.updatedAt = NSDate() 
newGroup.groupName = self.messages[i].groupName 
self.messages[i].imageFile.getDataInBackgroundWithBlock({ (imageData, error) -> Void in 
    if error == nil{ 
     newGroup.photo = imageData 
    }else{ 
     print(error) 
    } 
}) 
newGroup.lastMessage = self.messages[i].message 

let usersRelationship = newGroup.mutableSetValueForKey("Users") 
let arrayMembers = self.dictionaryGroupIds[self.messages[i].groupId]! as [String] 

print(arrayMembers) 

for member in arrayMembers { 

    print(member) 
    print("CODE IS STOPPING HERE ") 
    // MY CODE STOPS HERE 

    // When I want to print the members in the arraymembers, it never displays all the member, sometimes it is only one member than it is 3 members, but never all of them so 

    let fetchRequest = NSFetchRequest(entityName: "Users") 
    fetchRequest.predicate = NSPredicate(format: "username = %@", member) 
    fetchRequest.returnsObjectsAsFaults = false 

    do { 
     let result = try self.managedObjectContext.executeFetchRequest(fetchRequest) 
     usersRelationship.addObject(result) 
    }catch{ 
     let fetchError = error as NSError 
     print("\(fetchError), \(fetchError.userInfo)") 
    } 
} 

do { 
    // This get never printed to the log 
    print("SUCCESS") 
    try newGroup.managedObjectContext?.save() 
} catch { 
    let saveError = error as NSError 
    print("\(saveError), \(saveError.userInfo)") 
    print("CRASH") 
     } 
    } 
} 

Dies ist, was in das Protokoll angezeigt wird:

2016-03-28 08:51:09.511 WeGrupp[1268:35749] Warning: A long-running operation is being executed on the main thread. 
Break on warnBlockingOperationOnMainThread() to debug. 
2016-03-28 08:51:09.823 WeGrupp[1268:35749] Warning: A long-running operation is being executed on the main thread. 
Break on warnBlockingOperationOnMainThread() to debug. 
["[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]"] 
[email protected] 
CODE IS STOPPING HERE 
2016-03-28 08:51:10.140 WeGrupp[1268:35749] -[__NSArrayI entity]: unrecognized selector sent to instance 0x7fb0eb4d5c60 
2016-03-28 08:51:10.143 WeGrupp[1268:35749] Warning: A long-running operation is being executed on the main thread. 
Break on warnBlockingOperationOnMainThread() to debug. 

Das ist also Ich denke, es hat etwas mit Concurrency zu tun, aber ich konnte leider keine Antwort auf meine Frage finden. Ich war in anderen Foren, aber niemand konnte eine richtige Antwort geben.

Vielen Dank

+0

Haben Sie versucht zu tun, was die Warnung schlägt vor und legt eine Pause auf warnBlockingOperationOnMainThread, um zu sehen, wo es auftritt? Trotzdem vermute ich, dass das Problem darin besteht, das Foto im Hintergrund zu platzieren, wenn sich die Variable newGroup ändert. – Michael

+0

Versuchen Sie, das Foto für CoreData beizubehalten? Es wird nicht richtig funktionieren, da es im Hintergrund geladen wird, vielleicht nachdem Sie den MOC gespeichert haben. – Michael

+0

Danke für deine Hilfe Michael, aber könntest du genauer sagen, was du denkst, was ich tun könnte, weil ich es nicht wirklich verstehe? In der Tat, was ich versuche zu tun ist, alle Benutzer zu verknüpfen, ein Teil der Gruppe, die ich nur in den Code über diesem, in der gleichen Ansicht hinzugefügt. Weil ich eine Viele-zu-Viele-Beziehung zwischen Benutzern und Gruppen erstellt habe. Jede Gruppe hat viele Benutzer und jeder Benutzer kann so viele Gruppen haben – C00kieMonsta

Antwort

0

Erstens wäre es eine gute Idee sein, Ihre Parse Warnungen loszuwerden, indem eine Pause auf warnBlockingOperationOnMainThread() setzen. Ich kann keinen Vordergrund sehen, den Parse in Ihrem aktuellen Code aufruft, also muss er woanders sein. This SO question hat eine Antwort, die zeigt, wie der Haltepunkt definiert wird.

Zweitens: Der folgende Code ist ein Anliegen:

self.messages[i].imageFile.getDataInBackgroundWithBlock({ (imageData, error) -> Void in 
    if error == nil{ 
     newGroup.photo = imageData 
    }else{ 
     print(error) 
    } 
}) 

newGroup ist eine Coredata Einheit, und Sie sind dabei seine MOC zu sparen, aber Sie sind auch im Hintergrund zu aktualisieren. Als einfachen ersten Schritt, um zu sehen, ob das Problem verursacht wird, kommentieren Sie diesen Code aus. Idealerweise möchten Sie den MOC nur einmal am Ende aller Bildladungen speichern.

Drittens stürzt Ihr Code ab - "unerkannter Selektor an Instanz gesendet". Sie können sehen, wo dies geschieht, indem Sie alle Ausnahmen durchbrechen. Tun Sie dies unter dem Haltepunkt Navigation:

Add breakpoint

+0

Vielen Dank für Ihre Hilfe, ich arbeite gerade an dem ersten Punkt "warnBlockingOperationOnMainThread()", also für den Rest werde ich heute Abend sehen. – C00kieMonsta

+0

Ich weiß nicht ob, wenn Sie meinen Beitrag beantwortet haben, Sie durch das Update meiner Frage benachrichtigt wurden, aber wie Sie unten sehen können, bin ich immer noch mit meinem Problem festgefahren. Zumindest habe ich es geschafft, die "warnBlockingOperationOnMainThread()" loszuwerden, aber für den Rest arbeite ich noch daran. Wenn Sie also noch etwas Zeit haben, wäre ich Ihnen dankbar, wenn Sie sich meinen Code ansehen könnten: Vielen Dank – C00kieMonsta

Verwandte Themen