小编Vin*_*ren的帖子

发布/订阅,同时保持对系统完整状态的访问

我有一个维护应用程序全局状态的服务器。

客户端可以连接到服务器并获取有关全局状态更改的消息(发布/订阅机制以便服务器广播信息)。

然而,在启动时,客户根本没有关于全局状态的信息,但他们需要这些信息。我想要的是对于任何订阅系统的新客户端,第一条通知消息是应用程序的完整状态。然后他们只收到有关此状态的更改:

  1. 客户端连接到消息系统
  2. 它订阅消息系统
  3. 它收到的第一条消息是系统的完整状态
  4. 然后,它只接收有关全局状态的更改

这个想法类似于多人游戏,新玩家必须首先获得游戏的完整状态,然后仅发送游戏中的更改。

像 ActiveMQ 或 Stomp 这样的消息系统可以很好地满足我的需求,因为它们是多语言的,并且可以与多个传输层一起使用。然而,不存在发送完整状态(或以连贯方式累积最后更改)的概念。

当然,我可以轻松地以静态方式提供此状态(首先获得完整状态,然后订阅发布/订阅系统),但是我必须同时注意可能的更改(我是否丢失了一些更改)处理完整状态时?我刚刚检索到的全局状态中是否已考虑到此更改?...)。然而,我失去了 Stomp 和 ActiveMQ 已经提供的多语言/多传输方面。

是否有一些现有的库/工具可以做到这一点?ActiveMQ 的某种扩展?类似于 Stomp 的东西吗?还是需要手工制作?

messaging activemq-classic client-server stomp publish-subscribe

5
推荐指数
1
解决办法
913
查看次数

如何实现可配置的单例?

此问题与Android有关,但在其他情况下也可以询问.我需要创建一个暴露单身人士的图书馆; 或者我想确保只存在我的类的一个实例,并且可以在代码中的任何位置抓取而不传递引用.

但是单身人士需要一些参数.例如,在Android中,Context通常需要一个对象.我还必须确切地说,因为我提供了一个库,所以我希望用户能够轻松操作并且我无法控制Application Android 中的(此类有时可用于管理整个应用程序的对象实例).

一种已知的解决方案是执行以下操作:

static MySingleton sInstance;
MySingleton.getInstance(Context c) {
    if (sInstance == null) {
        sInstance = new MySingleton(c.getApplicationContext());
    }
    return sInstance;
}
Run Code Online (Sandbox Code Playgroud)

但它很奇怪,因为参数getInstance实际上只在第一次创建单身时使用.

我可以为单例提供一个setter并要求开发人员正确设置所需的参数,但可能会出现一些奇怪的情况:

// Good usage
MySingleton.getInstance().setContext(context.getApplicationContext());
MySingleton.getInstance().doSomethingThatRequiresContext(); // OK

// Bad usage
MySingleton.getInstance().doSomethingThatRequiresContext(); // Error!
MySingleton.getInstance().setContext(context.getApplicationContext());
Run Code Online (Sandbox Code Playgroud)

我可以检查每个方法的开头是否正确配置了单例,并在状态不好的情况下启动一些异常,但API使用起来不那么简单:

MySingleton.getInstance().setContext(context.getApplicationContext());

try {
    MySingleton.getInstance().doSomethingThatRequiresContext();
}
catch(BadSingletonConfiguration e) { }
Run Code Online (Sandbox Code Playgroud)

即使我使用运行时异常,使用也是危险的.

除非我恳请用户手动创建实例并确保自己只存在一个实例,否则我看不到一个好的解决方案.

java oop android design-patterns

5
推荐指数
1
解决办法
1365
查看次数

Xcode 代码完成:过滤以仅显示直接 API 方法

我在 Xcode 代码完成方面遇到很多麻烦。

当我只想用它来“浏览”对象的可用属性和方法时,我立即会得到很多不太有用的信息,例如从协议继承的所有元素NSObject、协议的方法UIAccessibilityAction……

一旦我输入某个方法或属性的一些字母,我很快就能找到我需要的内容并继续编码,但有时我什至不知道我的方法或属性的第一个字母。

我只想显示在@interface我想要自动完成的对象中创建的内容。

是否可以进一步过滤代码完成弹出窗口中显示的内容?我不想要一种跳转到接口声明的机制,这实际上是为了快速编码。

xcode autocomplete objective-c xcode7

5
推荐指数
0
解决办法
82
查看次数

如何使用Kotlin将函数输出转换为Unit

我在Kotlin中有一个应该返回Unit的函数有麻烦,但是由于使用了另一个返回布尔值的函数,所以存在类型不匹配.

这是一个人为的例子:

fun printAndReturnTrue(bar: Int): Boolean {
    println(bar)
    return true
}

fun foo(bar: Int): Unit = when(bar) {
    0 -> println("0")
    else -> printAndReturnTrue(bar)
}
Run Code Online (Sandbox Code Playgroud)

在这里,我实际上并不关心printAndReturnTrue返回布尔值的事实.我只想让foo执行副作用操作.但编译器警告类型不匹配:我else应该返回一个Unit值.

有没有一种很好的方法将值转换为Unit

我看到的最简单的解决方案是:

fun foo(bar: Int): Unit = when(bar) {
    0 -> println("0")
    else -> { 
        printAndReturnTrue(bar)
        Unit
    }
}
Run Code Online (Sandbox Code Playgroud)

要么:

fun foo(bar: Int): Unit = when(bar) {
    0 -> println("0")
    else -> eraseReturnValue(printAndReturnTrue(bar))
}

fun eraseReturnValue(value: Any) = Unit
Run Code Online (Sandbox Code Playgroud)

或者我使用完整的函数形式:

fun foo(bar: Int): Unit { 
    when(bar) …
Run Code Online (Sandbox Code Playgroud)

return function kotlin

5
推荐指数
1
解决办法
1072
查看次数

如何使用附近的连接获取我自己的端点 ID?

使用Nearby Connections,每个设备都有一个 endpointId,类似于zkHk

获取其他人的 endpointId 是微不足道的,因为它是在扫描或连接到其他设备时由 API 返回的。

我一定错过了一些东西,但我找不到获取我自己的 endpointId 的方法(除了实现一种机制,在这种机制中,连接的对等方回显我的 id)。对于我想跟踪发送给谁的内容的某些协议,它可能很有用。

我发现的唯一一件事是getLocalEndpointName但它返回的是我的名字,而不是我的 ID。尽管Nearby 的 C++ 版本似乎有它

你对 Java/Kotlin 有什么想法吗?我特别寻求获取 endpointId,而不是使用替代方法,例如在 localendpoint 名称中使用一种 GUID 作为替代。


编辑:一些用法示例

1) 例如,实现一些网络网格协议可能很有趣。几个设备互连形成一个全球网络,每个设备endpointId在再次发送之前将其添加到传入的有效载荷中,因此其他人可以检查他们是否应该将有效载荷发送到已经拥有它的设备。

2)我可能还想从设备 A 到 C 通过充当中继的 B 专门发送一个数据包,并在有效载荷中添加一些“来自:A”和“至:C”字段,以便网络知道如何路由数据并避免一些重传周期。这样做更简单,endpointId因为每个设备都有一个endpointId与其连接的列表。

3)它对于调试目的也很有趣。如果我使用连接到其他几个电话(例如星型网络)的电话进行一些测试,则更容易知道新数据来自哪个电话,如果我想name用于其他目的,则更是如此。

注意:所有这些都可以用不同的方式完成(例如,对设备的“名称”使用一些唯一标识符并检查它而不是endpointId),但这似乎有点麻烦。更重要的是endpointId保证了一种单一性,而我必须为name. 此外,在交换数据(仅endpointIdname)之前,我无法在另一台设备上获得大量信息,因此如果我将name其用作endpointId.

android google-nearby

5
推荐指数
1
解决办法
905
查看次数

如何使用XBee快速向其他XBee广播信息?

我正在使用几个XBee Zigbee和一些Arduino模块(或微控制器,Arduino不是强制性的).我在X /透明模式下配置了我的XBees.

我需要广播信息:当触摸一个模块时,每个其他模块必须同时立即做出反应.

不幸的是,如果我在单播模式下获得良好的速度效果,则广播模式中存在大量延迟.这是已知和记录的内容,请参阅XBee ZigBee寻址.

没有数据丢失,但它们有时会被XBee缓冲几秒钟,然后再次发送或传送到我的Arduino.

它似乎不是配置问题,它是广播协议的工作方式.关于如何加快这个过程的任何想法?

我唯一的一个就是使用API​​模式,让每个Arduino保留一份XBee地址列表,并将单播信息列入这些地址列表......但我失去了广播方法的舒适度,我不能轻松添加新模块而不更新每个Arduino.

embedded microcontroller arduino zigbee xbee

4
推荐指数
1
解决办法
8931
查看次数

在Flex中,是否有Spark相当于DividedBox?

我需要一种DividedBoxFlex(4.6).这是一个组件,其中两组组件由可以用鼠标移动的条分隔.因此,用户可以选择哪个组可以在屏幕上具有更多空间.

当然,也有HDividedBoxVDividedBox光环和即将到来的mx.*包.

但Spark没什么.此外,在Flex Builder,HDividedBoxVDividedBox没有被标记为建议的组件.

DividedBox是否与Spark相当?

如果不是:它是否在路线图上?使用Halo的DividedBox和我的Spark组件有什么缺点吗?

apache-flex actionscript-3 halo flex-spark

3
推荐指数
1
解决办法
2498
查看次数