Связь «к одному» с подклассом PFObject не работает с циклической ссылкой

Я создаю два пользовательских подкласса PFObject: Match и Set. Match имеет свойство setTest, которое указывает на Set. Оба класса зарегистрированы с помощью Parse в делегате приложения. Когда я инициализирую объект соответствия (который также создает объект набора), я получаю исключение.

Что я делаю не так?

Спасибо!

Класс матча:

class Match: PFObject, PFSubclassing
{
    @NSManaged var setTest:Set?


    convenience init (defaults:String?)
    {
        self.init()
        self.setTest = Set(withPlayer1Score: 0, player2Score: 0)
    }
}

static func parseClassName() -> String
{
    return "Match"
}

Установить класс:

class Set: PFObject, PFSubclassing {
    @NSManaged var player1Score:NSNumber?
    @NSManaged var player2Score:NSNumber?

    convenience init(withPlayer1Score player1Score:Int, player2Score:Int) {
        self.init()

        self.player1Score = player1Score
        self.player2Score = player2Score
    }



    //MARK: PFSubclassing
    static func parseClassName() -> String
    {
        return "Set"
    }
}

Затем где-то в коде я звоню

let match = Match(defaults: nil)
match.startDate = NSDate()
match.saveInBackgroundWithBlock({ (completed:Bool, error:NSError?) -> Void in
    assert(completed)
})

Когда запускается saveInBackground(), я получаю следующее исключение:

2015-12-31 14:41:18.337 TenStats Debug[4055:2031064] [Error]: Caught "NSInternalInconsistencyException" with reason "Found a circular dependency when saving.":
(
0   CoreFoundation                      0x0000000184b7d918 <redacted> + 148
1   libobjc.A.dylib                     0x00000001841ebf80 objc_exception_throw + 56
2   CoreFoundation                      0x0000000184b7d848 <redacted> + 0
3   Parse                               0x00000001007a53a4 +[PFObject(Private) collectDirtyChildren:children:files:seen:seenNew:currentUser:] + 1660
4   Parse                               0x00000001007a5788 __82+[PFObject(Private) collectDirtyChildren:children:files:seen:seenNew:currentUser:]_block_invoke + 136
5   CoreFoundation                      0x0000000184aceed4 <redacted> + 88
6   CoreFoundation                      0x0000000184abcb78 <redacted> + 224
7   Parse                               0x00000001007a50e8 +[PFObject(Private) collectDirtyChildren:children:files:seen:seenNew:currentUser:] + 960
8   Parse                               0x00000001007a551c +[PFObject(Private) collectDirtyChildren:children:files:seen:seenNew:currentUser:] + 2036
9   Parse                               0x00000001007a5a74 +[PFObject(Private) collectDirtyChildren:children:files:currentUser:] + 308
10  Parse                               0x00000001007a6694 +[PFObject(Private) _deepSaveAsyncChildrenOfObject:withCurrentUser:sessionToken:] + 260
11  Parse                               0x00000001007aa094 -[PFObject(Private) _saveChildrenInBackgroundWithCurrentUser:sessionToken:] + 176
12  Parse                               0x00000001007b2ddc __31-[PFObject(Private) saveAsync:]_block_invoke581 + 368
13  Bolts                               0x000000010055c2f4 __55-[BFTask continueWithExecutor:block:cancellationToken:]_block_invoke_2 + 124
14  Bolts                               0x00000001005586b8 __29+[BFExecutor defaultExecutor]_block_invoke_2 + 168
15  Bolts                               0x00000001005590f4 -[BFExecutor execute:] + 108
16  Bolts                               0x000000010055c21c __55-[BFTask continueWithExecutor:block:cancellationToken:]_block_invoke + 228
17  Bolts                               0x000000010055bc4c -[BFTask runContinuations] + 568
18  Bolts                               0x000000010055b224 -[BFTask trySetResult:] + 248
19  Bolts                               0x000000010055dc4c -[BFTaskCompletionSource setResult:] + 108
20  Bolts                               0x000000010055c79c __55-[BFTask continueWithExecutor:block:cancellationToken:]_block_invoke_3 + 528
21  Bolts                               0x000000010055c2f4 __55-[BFTask continueWithExecutor:block:cancellationToken:]_block_invoke_2 + 124
22  Bolts                               0x00000001005586b8 __29+[BFExecutor defaultExecutor]_block_invoke_2 + 168
23  Bolts                               0x00000001005590f4 -[BFExecutor execute:] + 108
24  Bolts                               0x000000010055c21c __55-[BFTask continueWithExecutor:block:cancellationToken:]_block_invoke + 228
25  Bolts                               0x000000010055bc4c -[BFTask runContinuations] + 568
26  Bolts                               0x000000010055b224 -[BFTask trySetResult:] + 248
27  Bolts                               0x000000010055dc4c -[BFTaskCompletionSource setResult:] + 108
28  Bolts                               0x000000010055c79c __55-[BFTask continueWithExecutor:block:cancellationToken:]_block_invoke_3 + 528
29  Bolts                               0x000000010055c430 __55-[BFTask continueWithExecutor:block:cancellationToken:]_block_invoke_2 + 440
30  Bolts                               0x00000001005586b8 __29+[BFExecutor defaultExecutor]_block_invoke_2 + 168
31  Bolts                               0x00000001005590f4 -[BFExecutor execute:] + 108
32  Bolts                               0x000000010055c21c __55-[BFTask continueWithExecutor:block:cancellationToken:]_block_invoke + 228
33  Bolts                               0x000000010055bc4c -[BFTask runContinuations] + 568
34  Bolts                               0x000000010055b224 -[BFTask trySetResult:] + 248
35  Bolts                               0x000000010055dc4c -[BFTaskCompletionSource setResult:] + 108
36  Bolts                               0x000000010055c79c __55-[BFTask continueWithExecutor:block:cancellationToken:]_block_invoke_3 + 528
37  Bolts                               0x000000010055c2f4 __55-[BFTask continueWithExecutor:block:cancellationToken:]_block_invoke_2 + 124
38  Bolts                               0x00000001005586b8 __29+[BFExecutor defaultExecutor]_block_invoke_2 + 168
39  Bolts                               0x00000001005590f4 -[BFExecutor execute:] + 108
40  Bolts                               0x000000010055c21c __55-[BFTask continueWithExecutor:block:cancellationToken:]_block_invoke + 228
41  Bolts                               0x000000010055bc4c -[BFTask runContinuations] + 568
42  Bolts                               0x000000010055b224 -[BFTask trySetResult:] + 248
43  Bolts                               0x000000010055dc4c -[BFTaskCompletionSource setResult:] + 108
44  Bolts                               0x000000010055c79c __55-[BFTask continueWithExecutor:block:cancellationToken:]_block_invoke_3 + 528
45  Bolts                               0x000000010055c2f4 __55-[BFTask continueWithExecutor:block:cancellationToken:]_block_invoke_2 + 124
46  Bolts                               0x00000001005586b8 __29+[BFExecutor defaultExecutor]_block_invoke_2 + 168
47  Bolts                               0x00000001005590f4 -[BFExecutor execute:] + 108
48  Bolts                               0x000000010055c21c __55-[BFTask continueWithExecutor:block:cancellationToken:]_block_invoke + 228
49  Bolts                               0x000000010055bc4c -[BFTask runContinuations] + 568
50  Bolts                               0x000000010055b224 -[BFTask trySetResult:] + 248
51  Bolts                               0x000000010055dc4c -[BFTaskCompletionSource setResult:] + 108
52  Bolts                               0x000000010055c79c __55-[BFTask continueWithExecutor:block:cancellationToken:]_block_invoke_3 + 528
53  Bolts                               0x000000010055c430 __55-[BFTask continueWithExecutor:block:cancellationToken:]_block_invoke_2 + 440
54  libdispatch.dylib                   0x0000000101c95bb0 _dispatch_client_callout + 16
55  libdispatch.dylib                   0x0000000101ca1764 _dispatch_barrier_sync_f_invoke + 164
56  Parse                               0x0000000100832dc0 PFThreadsafetySafeDispatchSync + 168
57  Parse                               0x000000010082b210 __33-[PFSQLiteDatabase initWithPath:]_block_invoke_2 + 40
58  libdispatch.dylib                   0x0000000101c95bf0 _dispatch_call_block_and_release + 24
59  libdispatch.dylib                   0x0000000101c95bb0 _dispatch_client_callout + 16
60  libdispatch.dylib                   0x0000000101ca4e10 _dispatch_root_queue_drain + 2344
61  libdispatch.dylib                   0x0000000101ca44d8 _dispatch_worker_thread3 + 132
62  libsystem_pthread.dylib             0x00000001847e5470 _pthread_wqthread + 1092
63  libsystem_pthread.dylib             0x00000001847e5020 start_wqthread + 4
).

person otusweb    schedule 31.12.2015    source источник
comment
Вам нужно сохранить набор, прежде чем установить указатель и сохранить матч   -  person Wain    schedule 31.12.2015
comment
Спасибо @Wain. Кажется, сработало. Если вы опубликуете свой комментарий в качестве ответа, я отмечу его как решение.   -  person otusweb    schedule 31.12.2015


Ответы (1)


Вы не можете установить объект в качестве места назначения указателя или добавить его в отношение, пока он не будет сохранен. Исключение, которое вы видите, не очень хорошее объяснение этому, но вам нужно будет сохранить Set, прежде чем подключать его к Match.

person Wain    schedule 01.01.2016