小编Gra*_*mbo的帖子

初始化期间调用异步方法时 MvvmCross UI 冻结

当我尝试在 ViewModel 初始化期间加载 API 端点的内容时,我在 Xamarin.Android/iOS 上遇到了 MvvmCross 问题。我正在从 API 加载某个区域的当前天气预报,并用异步方法编写它,并从初始化生命周期回调中调用它。到目前为止,我已经尝试过 Stat() 和 Init()。在这两种情况下,我的 UI 都加载了来自我的 ViewModel 的值,但随后立即冻结。如果我在异步代码中的任何位置设置断点,断点就会捕获并在播放时按预期工作。我怀疑某处存在某种竞争条件,但我不确定如何避免它并在我的 ViewModel/View 出现时加载数据。这是我的代码:

//天气服务

public async Task<WeatherStatus> GetWeatherStatus (string zip)
        {
            var client = new HttpClient();
            var msg = await client.GetAsync(string.Format(WeatherApiUrlBase, WeatherApiKey, zip));
            if (msg.IsSuccessStatusCode)
            {
                using (var stream = await msg.Content.ReadAsStreamAsync())
                {
                    using (var streamReader = new StreamReader(stream))
                    {
                        var str = await streamReader.ReadToEndAsync();
                        var obj = JsonConvert.DeserializeObject<WeatherStatus>(str);
                        return obj;
                    }
                }
            }
            return null;
        }
Run Code Online (Sandbox Code Playgroud)

//第一个视图模型

public async override void Start …
Run Code Online (Sandbox Code Playgroud)

c# android asynchronous mvvmcross xamarin

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

有没有办法让三元运算符适用于 Cloud Firestore 安全规则?

在我们的 Firebase 设置中,我们将用户的角色存储在自定义声明中。因此,在我们的 Cloud Firestore 安全规则中,我们需要评估用户是否具有执行操作的适当角色。因此,我创建了一个函数getRole,可以方便地从用户的身份验证令牌获取请求的值。然而,在某些边缘情况下,用户还没有角色,在这些情况下,我希望他们的角色评估为尽可能最低的安全角色,在我们的例子中,这只是"user"。我阅读了 CEL(通用表达式语言)的语言规范,这是该规则语言所基于的,并且它实际上支持三元运算符。(文档)。因此,我将此代码插入到我的 Firestore 安全规则中,在线编辑器验证了这些规则并接受了我的新规则。但是,我后来发现在本地运行我的安全规则单元测试并在 firebase 模拟器中加载规则时,出现此错误:

ERROR Use of ternary operator not allowed

因此,要么生产 Firestore 规则支持三元运算符,而本地模拟器不支持,要么生产规则针对 CEL 进行验证并在不应该通过验证的情况下通过验证。

无论如何,我希望能够安全地拥有一个返回用户角色的实际值的函数,或者如果未设置则返回默认的安全值。

请注意,我们试图省略该'role' in getCustomClaims()语句,如果自定义声明中不存在该密钥,则该语句会崩溃。

function getCustomClaims() {
  return request.auth.token;
}
function getRole() {
  return 'role' in getCustomClaims() ? getCustomClaims()['role'] : 'user';
}
Run Code Online (Sandbox Code Playgroud)

firebase firebase-security google-cloud-firestore

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