Значение приемника Swift Combine отличается от значения свойства @Published - PullRequest
0 голосов
/ 06 марта 2020

Я столкнулся с проблемой, когда в Combine у ​​меня есть логическое свойство @Published.

Когда я устанавливаю значение true, закрытие раковины запускается, и я могу посмотреть на полученное значение. Это так. Но когда я сравниваю его с фактическим свойством, которое я наблюдаю, они отличаются.

Этот фрагмент кода можно просто запустить на игровой площадке. Я не уверен, как это работает или почему значения будут другими

class TestModel {
    @Published var isLoading = false
}

let model = TestModel()

model.$isLoading.sink { (isLoading) in
    if isLoading != model.isLoading {
        print("values NOT same")
    }
}

model.isLoading = true

1 Ответ

3 голосов
/ 06 марта 2020

@Published публикует новое значение, прежде чем оно фактически изменит сохраненное значение. Я не знаю, почему Apple реализовала это таким образом.

Вот разборка метода установки Published, который публикует уведомление, а затем сохраняет новое значение. По адресу 462e7 публикует уведомление по телефону Combine.CurrentValueSubject.send(A) -> (). Позже, по адресу 4635f, он изменяет сохраненное значение, вызывая swift_modifyAtReferenceWritableKeyPath.

_$s7Combine9PublishedV18_enclosingInstance7wrapped7storagexqd___s24ReferenceWritableKeyPathCyqd__xGAHyqd__ACyxGGtcRld__CluisZTf4ngdgd_n:        // function signature specialization <Arg[1] = Owned To Guaranteed, Arg[2] = Dead, Arg[3] = Owned To Guaranteed, Arg[4] = Dead> of static Combine.Published.subscript.setter : <A where A1: AnyObject>(_enclosingInstance: A1, wrapped: Swift.ReferenceWritableKeyPath<A1, A>, storage: Swift.ReferenceWritableKeyPath<A1, Combine.Published<A>>) -> A
00000000000461b0         push       rbp                                         ; CODE XREF=_$s7Combine9PublishedV18_enclosingInstance7wrapped7storagexqd___s24ReferenceWritableKeyPathCyqd__xGAHyqd__ACyxGGtcRld__CluisZ+22, _$s7Combine9PublishedV18_enclosingInstance7wrapped7storagexqd___s24ReferenceWritableKeyPathCyqd__xGAHyqd__ACyxGGtcRld__CluiMZ.resume.0+126, _$s7Combine9PublishedV18_enclosingInstance7wrapped7storagexqd___s24ReferenceWritableKeyPathCyqd__xGAHyqd__ACyxGGtcRld__CluiMZ.resume.0+244
00000000000461b1         mov        rbp, rsp
00000000000461b4         push       r15
00000000000461b6         push       r14
00000000000461b8         push       r13
00000000000461ba         push       r12
00000000000461bc         push       rbx
00000000000461bd         sub        rsp, 0x48
00000000000461c1         mov        r13, rdx
00000000000461c4         mov        r15, rsi
00000000000461c7         mov        qword [rbp+var_40], rdi
00000000000461cb         mov        rax, qword [rdx]
00000000000461ce         mov        rcx, qword [_$ss24ReferenceWritableKeyPathCMo_fc4a8] ; _$ss24ReferenceWritableKeyPathCMo_fc4a8
00000000000461d5         mov        rcx, qword [rcx]
00000000000461d8         mov        r14, qword [rax+rcx+8]
00000000000461dd         mov        rax, qword [r14-8]
00000000000461e1         mov        rax, qword [rax+0x40]
00000000000461e5         add        rax, 0xf
00000000000461e9         and        rax, 0xfffffffffffffff0
00000000000461ed         mov        r12, rsp
00000000000461f0         sub        r12, rax
00000000000461f3         mov        rsp, r12
00000000000461f6         mov        rbx, rsp
00000000000461f9         sub        rbx, rax
00000000000461fc         mov        rsp, rbx
00000000000461ff         mov        qword [rbp+var_70], rsi
0000000000046203         mov        rdi, rsi
0000000000046206         call       imp___stubs__swift_unknownObjectRetain      ; swift_unknownObjectRetain
000000000004620b         lea        rdi, qword [rbp+var_70]
000000000004620f         mov        rax, rbx
0000000000046212         mov        qword [rbp+var_48], r13
0000000000046216         mov        rsi, r13
0000000000046219         call       imp___stubs__swift_getAtKeyPath             ; swift_getAtKeyPath
000000000004621e         movsxd     rax, dword [r14+0x20]
0000000000046222         mov        r13, qword [rbx+rax]
0000000000046226         test       r13, r13
0000000000046229         je         loc_46269

000000000004622b         mov        qword [rbp+var_50], r15
000000000004622f         mov        r15, qword [r14+0x10]
0000000000046233         mov        rdi, r13                                    ; argument "instance" for method imp___stubs__swift_retain
0000000000046236         call       imp___stubs__swift_retain                   ; swift_retain
000000000004623b         mov        rdi, rbx                                    ; argument #1 for method _$s7Combine9PublishedVyxGRld__Cr__lWOh
000000000004623e         mov        qword [rbp+var_38], r15
0000000000046242         mov        rsi, r15                                    ; argument #2 for method _$s7Combine9PublishedVyxGRld__Cr__lWOh
0000000000046245         mov        r15, qword [rbp+var_50]
0000000000046249         mov        rdx, r14                                    ; argument #3 for method _$s7Combine9PublishedVyxGRld__Cr__lWOh
000000000004624c         call       _$s7Combine9PublishedVyxGRld__Cr__lWOh      ; outlined destroy of Combine.Published<A>
0000000000046251         call       _$s7Combine25ObservableObjectPublisherC4sendyyF ; Combine.ObservableObjectPublisher.send() -> ()
0000000000046256         mov        rdi, r13                                    ; argument "instance" for method imp___stubs__swift_release
0000000000046259         call       imp___stubs__swift_release                  ; swift_release
000000000004625e         mov        rdi, qword [rbp+var_70]
0000000000046262         call       imp___stubs__swift_unknownObjectRelease     ; swift_unknownObjectRelease
0000000000046267         jmp        loc_46284

                     loc_46269:
0000000000046269         mov        rdi, r15                                    ; CODE XREF=_$s7Combine9PublishedV18_enclosingInstance7wrapped7storagexqd___s24ReferenceWritableKeyPathCyqd__xGAHyqd__ACyxGGtcRld__CluisZTf4ngdgd_n+121
000000000004626c         call       imp___stubs__swift_unknownObjectRelease     ; swift_unknownObjectRelease
0000000000046271         mov        rsi, qword [r14+0x10]                       ; argument #2 for method _$s7Combine9PublishedVyxGRld__Cr__lWOh
0000000000046275         mov        rdi, rbx                                    ; argument #1 for method _$s7Combine9PublishedVyxGRld__Cr__lWOh
0000000000046278         mov        qword [rbp+var_38], rsi
000000000004627c         mov        rdx, r14                                    ; argument #3 for method _$s7Combine9PublishedVyxGRld__Cr__lWOh
000000000004627f         call       _$s7Combine9PublishedVyxGRld__Cr__lWOh      ; outlined destroy of Combine.Published<A>

                     loc_46284:
0000000000046284         mov        qword [rbp+var_70], r15                     ; CODE XREF=_$s7Combine9PublishedV18_enclosingInstance7wrapped7storagexqd___s24ReferenceWritableKeyPathCyqd__xGAHyqd__ACyxGGtcRld__CluisZTf4ngdgd_n+183
0000000000046288         mov        rdi, r15
000000000004628b         call       imp___stubs__swift_unknownObjectRetain      ; swift_unknownObjectRetain
0000000000046290         mov        rbx, qword [rbp+var_48]
0000000000046294         mov        rdi, rbx                                    ; argument "instance" for method imp___stubs__swift_retain
0000000000046297         call       imp___stubs__swift_retain                   ; swift_retain
000000000004629c         lea        rdi, qword [rbp+var_70]
00000000000462a0         mov        rax, r12
00000000000462a3         mov        rsi, rbx
00000000000462a6         call       imp___stubs__swift_getAtKeyPath             ; swift_getAtKeyPath
00000000000462ab         movsxd     rdi, dword [r14+0x1c]
00000000000462af         cmp        qword [r12+rdi], 0x0
00000000000462b4         je         loc_46317

00000000000462b6         add        rdi, r12                                    ; argument #1 for method _$s7Combine9PublishedV9PublisherVyx_GRld__Cr__lWOc
00000000000462b9         lea        rsi, qword [rbp+var_30]                     ; argument #2 for method _$s7Combine9PublishedV9PublisherVyx_GRld__Cr__lWOc
00000000000462bd         call       _$s7Combine9PublishedV9PublisherVyx_GRld__Cr__lWOc ; outlined init with copy of Combine.Published<A>.Publisher
00000000000462c2         mov        rdi, r12                                    ; argument #1 for method _$s7Combine9PublishedVyxGRld__Cr__lWOh
00000000000462c5         mov        rbx, qword [rbp+var_38]
00000000000462c9         mov        rsi, rbx                                    ; argument #2 for method _$s7Combine9PublishedVyxGRld__Cr__lWOh
00000000000462cc         mov        rdx, r14                                    ; argument #3 for method _$s7Combine9PublishedVyxGRld__Cr__lWOh
00000000000462cf         call       _$s7Combine9PublishedVyxGRld__Cr__lWOh      ; outlined destroy of Combine.Published<A>
00000000000462d4         mov        r13, qword [rbp+var_30]
00000000000462d8         mov        rdi, r13                                    ; argument "instance" for method imp___stubs__swift_retain
00000000000462db         call       imp___stubs__swift_retain                   ; swift_retain
00000000000462e0         mov        r12, qword [rbp+var_40]
00000000000462e4         mov        rdi, r12                                    ; argument #1 for method _$s7Combine19CurrentValueSubjectC4sendyyxF
00000000000462e7         call       _$s7Combine19CurrentValueSubjectC4sendyyxF  ; Combine.CurrentValueSubject.send(A) -> ()
00000000000462ec         mov        rdi, r13                                    ; argument "instance" for method imp___stubs__swift_release
00000000000462ef         mov        r13, rbx
00000000000462f2         mov        rbx, qword [rbp+var_48]
00000000000462f6         call       imp___stubs__swift_release                  ; swift_release
00000000000462fb         lea        rdi, qword [rbp+var_30]                     ; argument #1 for method _$s7Combine9PublishedV9PublisherVyx_GRld__Cr__lWOh
00000000000462ff         call       _$s7Combine9PublishedV9PublisherVyx_GRld__Cr__lWOh ; outlined destroy of Combine.Published<A>.Publisher
0000000000046304         mov        rdi, qword [rbp+var_70]
0000000000046308         call       imp___stubs__swift_unknownObjectRelease     ; swift_unknownObjectRelease
000000000004630d         mov        rdi, rbx                                    ; argument "instance" for method imp___stubs__swift_release
0000000000046310         call       imp___stubs__swift_release                  ; swift_release
0000000000046315         jmp        loc_4633d

                     loc_46317:
0000000000046317         mov        rdi, r15                                    ; CODE XREF=_$s7Combine9PublishedV18_enclosingInstance7wrapped7storagexqd___s24ReferenceWritableKeyPathCyqd__xGAHyqd__ACyxGGtcRld__CluisZTf4ngdgd_n+260
000000000004631a         call       imp___stubs__swift_unknownObjectRelease     ; swift_unknownObjectRelease
000000000004631f         mov        rdi, rbx                                    ; argument "instance" for method imp___stubs__swift_release
0000000000046322         call       imp___stubs__swift_release                  ; swift_release
0000000000046327         mov        rdi, r12                                    ; argument #1 for method _$s7Combine9PublishedVyxGRld__Cr__lWOh
000000000004632a         mov        r13, qword [rbp+var_38]
000000000004632e         mov        rsi, r13                                    ; argument #2 for method _$s7Combine9PublishedVyxGRld__Cr__lWOh
0000000000046331         mov        rdx, r14                                    ; argument #3 for method _$s7Combine9PublishedVyxGRld__Cr__lWOh
0000000000046334         call       _$s7Combine9PublishedVyxGRld__Cr__lWOh      ; outlined destroy of Combine.Published<A>
0000000000046339         mov        r12, qword [rbp+var_40]

                     loc_4633d:
000000000004633d         mov        qword [rbp+var_30], r15                     ; CODE XREF=_$s7Combine9PublishedV18_enclosingInstance7wrapped7storagexqd___s24ReferenceWritableKeyPathCyqd__xGAHyqd__ACyxGGtcRld__CluisZTf4ngdgd_n+357
0000000000046341         mov        rdi, r15
0000000000046344         call       imp___stubs__swift_unknownObjectRetain      ; swift_unknownObjectRetain
0000000000046349         mov        rdi, rbx                                    ; argument "instance" for method imp___stubs__swift_retain
000000000004634c         call       imp___stubs__swift_retain                   ; swift_retain
0000000000046351         lea        r14, qword [rbp+var_70]
0000000000046355         lea        rsi, qword [rbp+var_30]
0000000000046359         mov        rdi, r14
000000000004635c         mov        rdx, rbx
000000000004635f         call       imp___stubs__swift_modifyAtReferenceWritableKeyPath ; swift_modifyAtReferenceWritableKeyPath
0000000000046364         mov        r15, rax
0000000000046367         mov        rdi, rdx
000000000004636a         mov        rax, qword [r13-8]
000000000004636e         mov        rsi, r12
0000000000046371         mov        rdx, r13
0000000000046374         call       qword [rax+0x28]
0000000000046377         mov        rdi, r14
000000000004637a         xor        esi, esi
000000000004637c         call       r15
000000000004637f         mov        rdi, qword [rbp+var_30]
0000000000046383         call       imp___stubs__swift_unknownObjectRelease     ; swift_unknownObjectRelease
0000000000046388         mov        rdi, rbx                                    ; argument "instance" for method imp___stubs__swift_release
000000000004638b         call       imp___stubs__swift_release                  ; swift_release
0000000000046390         lea        rsp, qword [rbp+var_28]
0000000000046394         pop        rbx
0000000000046395         pop        r12
0000000000046397         pop        r13
0000000000046399         pop        r14
000000000004639b         pop        r15
000000000004639d         pop        rbp
000000000004639e         ret
...