Я пытаюсь создать Единый связанный список , используя Parse PFObjects.Каждый объект PFObject имеет указатель на объект next в списке.Я могу прикрепить их локально, но у меня возникла проблема при сохранении их на Parse Server.
Проблема начинается здесь:
+ (BFTask *)_deepSaveAsyncChildrenOfObject:(id)object withCurrentUser:(PFUser *)currentUser sessionToken:(NSString *)sessionToken;
// This saves all of the objects and files reachable from the given object.
// It does its work in multiple waves, saving as many as possible in each wave.
// If there's ever an error, it just gives up, sets error, and returns NO;
При попытке сохранить первый объект в списке он получит доступ к дочернему объекту (следующему объекту) и попытается сохранить его первым.Поскольку дочерний объект (следующий объект) также имеет указатель на следующий объект в списке, это будет продолжаться до последнего объекта в списке.
Это успешно для небольшого количества объектов (<200), но как только мы обрабатываем связанный список с <strong>большим количеством объектов , здесь происходит сбой :
/**
Finds all of the objects that are reachable from child, including child itself,
and adds them to the given mutable array. It traverses arrays and json objects.
@param node An kind object to search for children.
@param dirtyChildren The array to collect the result into.
@param seen The set of all objects that have already been seen.
@param seenNew The set of new objects that have already been seen since the
last existing object.
*/
+ (BOOL)collectDirtyChildren:(id)node
children:(NSMutableSet *)dirtyChildren
files:(NSMutableSet *)dirtyFiles
seen:(NSSet *)seen
seenNew:(NSSet *)seenNew
currentUser:(PFUser *)currentUser
error:(NSError * __autoreleasing *)error
Этот метод вызывается deepSaveAsyncChildrenOfObject
для создания NSSet дочерних объектов, которые также должны быть сохранены.
@synchronized ([object lock]) {
// Check for cycles of new objects. Any such cycle means it will be
// impossible to save this collection of objects, so throw an exception.
if (object.objectId) {
seenNew = [NSSet set];
} else {
if ([seenNew containsObject:object] && error) {
*error = [PFErrorUtilities errorWithCode:kPFErrorInvalidPointer
message:@"Found a circular dependency when saving."];
return NO;
}
// ?CRASH: Thread 160: EXC_BAD_ACCESS (code=2, address=0x70000fc80f38)
seenNew = [seenNew setByAddingObject:object];
}
// Check for cycles of any object. If this occurs, then there's no
// problem, but we shouldn't recurse any deeper, because it would be
// an infinite recursion.
if ([seen containsObject:object]) {
return YES;
}
seen = [seen setByAddingObject:object];
// Recurse into this object's children looking for dirty children.
// We only need to look at the child object's current estimated data,
// because that's the only data that might need to be saved now.
toSearch = [object._estimatedData.dictionaryRepresentation copy];
}
Итак, этого можно избежать, сохранив объекты PFObjects без сохранения дочерних объектов , есть ли способ сделать это?Или есть обходной путь для сохранения связанных списков на Parse Server, возможно, с помощью облачного кода или изменения модели данных?