gpt4 book ai didi

ios - 未调用委托(delegate)字段时实现 `DelegateProxy` (RxSwift/RxCocoa) `delegate`

转载 作者:行者123 更新时间:2023-11-28 13:53:18 25 4
gpt4 key购买 nike

我需要一些关于 DelegateProxy 的帮助执行。具体来说,当委托(delegate)字段的名称不同于简单的 delegate 时,正确的实现方式是什么? ?如 SKPhysicsContactDelegate它叫做contactDelegate .我尝试定义一个计算值 delegate , 但它并没有起到作用 - https://github.com/maxvol/RxSpriteKit/blob/master/Proxy/RxSKPhysicsContactDelegateProxy.swift

它失败了 "DelegateProxy has no factory of <PKPhysicsWorld: 0x280b18990>. Implement DelegateProxy subclass for <PKPhysicsWorld: 0x280b18990> first."也许它甚至与委托(delegate)字段名称无关,但这是我能找到的与正常工作的代理的唯一区别。

更新:哈!我刚刚注意到错误消息显示 PKPhysicsWorld , 不是 SKPhysicsWorld .所以我的假设是它与 object 的事实有关。在DelegateProxyFactory.createProxyPKPhysicsWorld而不是 SKPhysicsWorld_factories[ObjectIdentifier(mirror.subjectType)]返回 nil .

最佳答案

您收到该错误的原因是您的 registerKnownImplementations() 函数没有运行。

以下要点应该有效:https://gist.github.com/dtartaglia/9f1f937628504ca56dbb1aac7d91df2b

代码也在下面,但要点可以保持最新:

//
// SKPhysicsWorld+Rx.swift
//
// Created by Daniel Tartaglia on 21 Jan 2019.
// Copyright © 2019 Daniel Tartaglia. MIT License.
//

import RxSwift
import SpriteKit

public
extension Reactive where Base: SKPhysicsWorld {

var didBegin: Observable<SKPhysicsContact> {
return Observable.create { observer in
physicsContatctDelegatesLock.lock(); defer { physicsContatctDelegatesLock.unlock() }
let uuid = UUID()
if let (delegate, beginners, enders) = physicsContatctDelegates[self.base] {
var new = beginners
new[uuid] = observer
physicsContatctDelegates[self.base] = (delegate, new, enders)
}
else {
let delegate = PhysicsContactDelegate(for: self.base)
self.base.contactDelegate = delegate
physicsContatctDelegates[self.base] = (delegate, [uuid: observer], [:])
}

return Disposables.create {
physicsContatctDelegatesLock.lock(); defer { physicsContatctDelegatesLock.unlock() }
let (delegate, beginners, enders) = physicsContatctDelegates[self.base]!
var new = beginners
new.removeValue(forKey: uuid)
if new.isEmpty && enders.isEmpty {
physicsContatctDelegates.removeValue(forKey: self.base)
}
else {
physicsContatctDelegates[self.base] = (delegate, new, enders)
}
}
}
}

var didEnd: Observable<SKPhysicsContact> {
return Observable.create { observer in
physicsContatctDelegatesLock.lock(); defer { physicsContatctDelegatesLock.unlock() }
let uuid = UUID()
if let (delegate, beginners, enders) = physicsContatctDelegates[self.base] {
var new = enders
new[uuid] = observer
physicsContatctDelegates[self.base] = (delegate, beginners, new)
}
else {
let delegate = PhysicsContactDelegate(for: self.base)
self.base.contactDelegate = delegate
physicsContatctDelegates[self.base] = (delegate, [:], [uuid: observer])
}

return Disposables.create {
physicsContatctDelegatesLock.lock(); defer { physicsContatctDelegatesLock.unlock() }
let (delegate, beginners, enders) = physicsContatctDelegates[self.base]!
var new = enders
new.removeValue(forKey: uuid)
if new.isEmpty && enders.isEmpty {
physicsContatctDelegates.removeValue(forKey: self.base)
}
else {
physicsContatctDelegates[self.base] = (delegate, beginners, new)
}
}
}
}
}

private
class PhysicsContactDelegate: NSObject, SKPhysicsContactDelegate {

init(for world: SKPhysicsWorld) {
self.world = world
super.init()
}

func didBegin(_ contact: SKPhysicsContact) {
physicsContatctDelegatesLock.lock(); defer { physicsContatctDelegatesLock.unlock() }
let (_, beginners, _) = physicsContatctDelegates[world]!
for each in beginners.values {
each.onNext(contact)
}
}

func didEnd(_ contact: SKPhysicsContact) {
physicsContatctDelegatesLock.lock(); defer { physicsContatctDelegatesLock.unlock() }
let (_, _, enders) = physicsContatctDelegates[world]!
for each in enders.values {
each.onNext(contact)
}
}

let world: SKPhysicsWorld
}

private let physicsContatctDelegatesLock = NSRecursiveLock()
private var physicsContatctDelegates: [SKPhysicsWorld: (SKPhysicsContactDelegate, [UUID: AnyObserver<SKPhysicsContact>], [UUID: AnyObserver<SKPhysicsContact>])] = [:]

关于ios - 未调用委托(delegate)字段时实现 `DelegateProxy` (RxSwift/RxCocoa) `delegate`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54266227/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com