Ошибка при попытке извлечь объекты из основных данных "-[__NSArrayI entity]: нераспознанный селектор отправлен в экземпляр"
Я пытаюсь получить все данные из Parse и синхронизировать эти данные с базовыми данными с моего телефона. В настоящее время я сталкиваюсь с небольшой проблемой с запросом выборки, который не выполняется правильно. Я думаю, что причина в том, что я использую managedObjectContext для другой задачи, но я не знаю, как это исправить.
Я четко указал в своем коде, где возникает проблема. И это довольно странно, потому что мой код не падает, а просто печатает ошибку в журнале. (Я поместил результаты отображения в журнал чуть ниже кода)
Это мой код:
// 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")
}
}
}
Вот что отображается в журнале:
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.
["test1@info.com", "test2@info.com", "test3@info.com", "test4@info.com", "test5@info.com", "test6@info.com"]
te1t2@info.com
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.
Вот и все, я думаю, что это как-то связано с параллелизмом, но я не смог найти ответ на свой вопрос, к сожалению. Я был на других форумах, но никто не мог дать правильный ответ.
Большое спасибо
1 ответ
Во-первых, было бы неплохо избавиться от предупреждений о разборе, сделав перерыв warnBlockingOperationOnMainThread()
, Я не вижу никаких вызовов Parse переднего плана в вашем текущем коде, поэтому он должен быть в другом месте. На этот вопрос SO есть ответ, который показывает, как определить точку останова.
Во-вторых, проблема заключается в следующем коде:
self.messages[i].imageFile.getDataInBackgroundWithBlock({ (imageData, error) -> Void in
if error == nil{
newGroup.photo = imageData
}else{
print(error)
}
})
newGroup
является сущностью CoreData, и вы собираетесь сохранить ее MOC, но вы также обновляете ее в фоновом режиме. В качестве простого первого шага, чтобы увидеть, вызывает ли это проблему, закомментируйте этот код. В идеале вы хотите сохранить MOC только один раз, в конце всех загрузок изображения.
В-третьих, ваш код падает - "нераспознанный селектор отправлен на экземпляр". Вы можете увидеть, где это происходит, разбив все исключения. Сделайте это под навигатором точки останова: