[英]How to modify variables outside of a function in PHP / better way to do something
[英]How to modify variables outside of their scope in kotlin?
我了解在 Kotlin 中没有“非局部变量”或“全局变量”之类的东西我正在寻找一种方法来修改 Kotlin 中另一个“范围”中的变量,方法是使用下面的 ZC1C425268E68385D1ABZA944F:
class Listres(){
var listsize = 0
fun gatherlistresult(){
var listallinfo = FirebaseStorage.getInstance()
.getReference()
.child("MainTimeline/")
.listAll()
listallinfo.addOnSuccessListener {
listResult -> listsize += listResult.items.size
}
}
}
listsize 的值始终为 0(从.addOnSuccessListener
scope 内部记录结果返回 8)所以很明显listsize
变量没有被修改。 我在其他网站上看到了很多关于这个主题的不同帖子,但没有一个适合我的用例。
我只是想在.addOnSuccessListener
回调中修改listsize
此方法将始终返回 0,因为在方法执行完成后将调用addOnSuccessListener()
侦听器。 addOnSuccessListener()
是asynchronous
操作的回调方法,如果它只成功,您将获得该值。
您可以通过更改以下代码来获取值:
class Demo {
fun registerListResult() {
var listallinfo = FirebaseStorage.getInstance()
.getReference()
.child("MainTimeline/")
.listAll()
listallinfo.addOnSuccessListener {
listResult -> listsize += listResult.items.size
processResult(listsize)
}
listallinfo.addOnFailureListener {
// Uh-oh, an error occurred!
}
}
fun processResult(listsize: Int) {
print(listResult+"") // you will get the 8 here as you said
}
}
您正在寻找的是一种将一些异步处理桥接到同步上下文的方法。 如果可能的话,(在我看来)在整个代码库中坚持使用一个 model(同步或异步)通常会更好。
话虽如此,有时这些情况是我们无法控制的。 我在类似情况下使用的一种方法是引入BlockingQueue
作为数据 pipe 以将数据从异步上下文传输到同步上下文。 在您的情况下,这可能看起来像这样:
class Demo {
var listSize = 0
fun registerListResult() {
val listAll = FirebaseStorage.getInstance()
.getReference()
.child("MainTimeline/")
.listAll()
val dataQueue = ArrayBlockingQueue<Int>(1)
listAll.addOnSuccessListener { dataQueue.put(it.items.size) }
listSize = dataQueue.take()
}
}
关键点是:
Queue
接口有一个阻塞变体,将用于 pipe 数据从异步上下文(侦听器)到同步上下文(调用代码)put()
OnSuccessListener
内的队列中take()
方法,这将导致该线程阻塞,直到一个值可用如果这对你不起作用,希望它至少能激发一些新的想法!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.