Сохранить LinkedList на Parse Server - PullRequest
0 голосов
/ 12 июня 2018

Я пытаюсь создать Единый связанный список , используя 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, возможно, с помощью облачного кода или изменения модели данных?

...