小编Emi*_*pis的帖子

在 SwiftUI 中使用参数初始化 @StateObject

我想知道目前是否有(在询问时,第一个 Xcode 12.0 Beta)使用@StateObject来自初始化程序的参数来初始化 a 的方法。

更具体地说,这段代码可以正常工作:

struct MyView: View {
  @StateObject var myObject = MyObject(id: 1)
}
Run Code Online (Sandbox Code Playgroud)

但这不会:

struct MyView: View {
  @StateObject var myObject: MyObject

  init(id: Int) {
    self.myObject = MyObject(id: id)
  }
}
Run Code Online (Sandbox Code Playgroud)

从我理解的作用@StateObject是使视图成为对象的所有者。我使用的当前解决方法是传递已经初始化的 MyObject 实例,如下所示:

struct MyView: View {
  @ObservedObject var myObject: MyObject

  init(myObject: MyObject) {
    self.myObject = myObject
  }
}
Run Code Online (Sandbox Code Playgroud)

但是现在,据我所知,创建对象的视图拥有它,而这个视图没有。

谢谢。

swift swiftui xcode12

44
推荐指数
4
解决办法
9233
查看次数

实现内部类型不同的 Swift 5.1 集合

我正在构建一个在 TableViewController 中显示远程 iBeacon 的 iOS 应用程序。

为了提高性能并测试新的 Swift 5.1 差异功能,我编写了以下代码:

private func updateBeacons(_ rangedBeacons: [CLBeacon]) {
    guard beacons != rangedBeacons else { return }

    let difference = rangedBeacons.difference(from: beacons)
    // Also tried:
    // let difference = rangedBeacons.difference(from: beacons, by: { $0.uuid == $1.uuid })

    // ...
}
Run Code Online (Sandbox Code Playgroud)

当到达此代码时,将fatalError抛出:

致命错误:不受支持:文件 /BuildRoot/Library/Caches/com.apple.xbs/Sources/swiftlang/swiftlang-1100.2.259.70/swift/stdlib/public/core/ArrayBuffer.swift,第 231 行

如何对CLBeacons执行收集差异?

引用的代码可以在这里找到:https : //github.com/apple/swift/blob/master/stdlib/public/core/ArrayBuffer.swift#L226-L232

ios swift

7
推荐指数
1
解决办法
292
查看次数

删除 LiveData 返回函数内的 Firestore 快照侦听器

我正在尝试优化我的应用程序的性能,但我注意到我没有从我的存储库中删除 Firestore 侦听器。

我的存储库有许多返回 a 的函数,LiveData然后通过来自ViewModels视图的转换进行观察。

一次性操作绝对可以正常工作(上传、删除等),但是当活动完成时,永久侦听器不会被垃圾收集。

现在存储库中的函数如下所示:

// [...]
class Repository {   
  // [...]
  fun retrieveCode() {
  val observable = MutableLiveData<Code>()
  val reference = 
    FirebaseFirestore.getInstance().collection(/**/).document(/**/)

  reference
    .addSnapshotListener { snapshot, exception -> 
      if(exception != null) {
        observable.value = null
      }

      if(snapshot != null {
        observable.value = snapshot.//[convert to object]
      }
   }

   return observable
  }
}
Run Code Online (Sandbox Code Playgroud)

我找到了一种解决方法,即创建一个自定义LiveData对象,在它变为非活动状态时处理侦听器删除,如下所示:

class CodeLiveData(private val reference: DocumentReference): 
  LiveData<Code>(), EventListener<DocumentSnapshot>{
  private var registration: ListenerRegistration? = null

  override fun onEvent(snapshot: DocumentSnapshot?, 
    exception: …
Run Code Online (Sandbox Code Playgroud)

kotlin firebase google-cloud-firestore

2
推荐指数
1
解决办法
2795
查看次数