2015-12-31 6 views
1

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

Что я делаю неправильно?

Спасибо!

класс Match:

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 
). 
+0

Вам нужно сохранить набор до того, как вы установите указатель и сохраните его. – Wain

+0

Спасибо @Wain. Кажется, сработало. Если вы опубликуете свой комментарий в качестве ответа, я помечаю его решением. – otusweb

ответ

2

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

 Смежные вопросы

  • Нет связанных вопросов^_^