Skip to content

Commit

Permalink
删除国内数据存储 SDK V3 版本中 LiveQuery 相关描述 (#1164)
Browse files Browse the repository at this point in the history
Co-authored-by: 余文建 <8997665+yu_wenjian@user.noreply.gitee.com>
  • Loading branch information
yuwenjian and 余文建 authored Sep 2, 2024
1 parent 15a7e61 commit f86592b
Show file tree
Hide file tree
Showing 6 changed files with 8 additions and 1,533 deletions.
172 changes: 0 additions & 172 deletions versioned_docs/version-v3/sdk/storage/dotnet-guide/dotnet.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -728,178 +728,6 @@ LCQuery<LCObject> query = LCQuery<LCObject>.And(new LCQuery<LCObject>[] { priori
- 无索引的排序(另外除非复合索引同时覆盖了查询和排序,否则只有其中一个能使用索引)
- 无索引的查询(另外除非复合索引同时覆盖了所有条件,否则未覆盖到的条件无法使用索引,如果未覆盖的条件区分度较低将会扫描较多的数据)

<Conditional brand="leancloud">

## LiveQuery

LiveQuery 衍生于 [`LCQuery`](#查询),并为其带来了更强大的功能。它可以让你无需编写复杂的逻辑便可在客户端之间同步数据,这对于有实时数据同步需求的应用来说很有帮助。

设想你正在开发一个多人协作同时编辑一份文档的应用,单纯地使用 `LCQuery` 并不是最好的做法,因为它只具备主动拉取的功能,而应用并不知道什么时候该去拉取。

想要解决这个问题,就要用到 LiveQuery 了。借助 LiveQuery,你可以订阅所有需要保持同步的 `LCQuery`。订阅成功后,一旦有符合 `LCQuery``LCObject` 发生变化,云端就会主动、实时地将信息通知到客户端。

LiveQuery 使用 WebSocket 在客户端和云端之间建立连接。WebSocket 的处理会比较复杂,而我们将其封装成了一个简单的 API 供你直接使用,无需关注背后的原理。

### 启用 LiveQuery

进入 **<Path to="storage" /> > 服务设置**,在 **安全设置** 里面勾选 **启用 LiveQuery**

```cs
using LeanCloud.LiveQuery;
```

### Demo

下面是在使用了 LiveQuery 的网页应用和手机应用中分别操作,数据保持同步的效果:

<video
src="https://capacity-files.lcfile.com/1496988080458"
controls
autoPlay
muted
preload="auto"
width="100%"
height="100%"
>
HTML5 Video is required for this demo, which your browser doesn't support.
</video>

使用我们的「LeanTodo」微信小程序和网页应用,可以实际体验以上视频所演示的效果,步骤如下:

1. 微信扫码,添加小程序「LeanTodo」;

![LeanTodo mini program](/img/leantodo-weapp-qr.jpg)

2. 进入小程序,点击首页左下角 **设置** > **账户设置**,输入便于记忆的用户名和密码;

3. 使用浏览器访问 <https://leancloud.github.io/leantodo-vue/>,输入刚刚在小程序中更新好的账户信息,点击 **Login**;

4. 随意添加更改数据,查看两端的同步状态。

注意按以上顺序操作。在网页应用中使用 **Signup** 注册的账户无法与小程序创建的账户相关联,所以如果颠倒以上操作顺序,则无法观测到数据同步效果。

[LiveQuery 公开课](http://www.bilibili.com/video/av11291992/) 涵盖了许多开发者关心的问题和解答。

### 构建订阅

首先创建一个普通的 `LCQuery` 对象,添加查询条件(如有),然后进行订阅操作:

```cs
LCQuery<LCObject> query = new LCQuery<LCObject>("Todo");
query.WhereEqualTo("isComplete", true);
await query.Subscribe();
// 订阅成功
```

LiveQuery 不支持内嵌查询,也不支持返回指定属性。

订阅成功后,就可以接收到和 `LCObject` 相关的更新了。假如在另一个客户端上创建了一个 `Todo` 对象,对象的 `title` 设为 `更新作品集`,那么下面的代码可以获取到这个新的 `Todo`:

```cs
LCQuery<LCObject> query = new LCQuery<LCObject>("Todo");
LCLiveQuery liveQuery = await query.Subscribe();
liveQuery.OnCreate = (obj) => {
print(obj["title"]); // 更新作品集
};
```

此时如果有人把 `Todo` `content` 改为 `把我最近画的插画放上去`,那么下面的代码可以获取到本次更新:

```cs
liveQuery.OnUpdate = (updatedTodo, updatedKeys) => {
print(updatedTodo["content"]); // 把我最近画的插画放上去
};
```

### 事件处理

订阅成功后,可以选择监听如下几种数据变化:

- `create`
- `update`
- `enter`
- `leave`
- `delete`

#### `create` 事件

当有新的满足 `LCQuery` 查询条件的 `LCObject` 被创建时,`create` 事件会被触发。下面的 `obj` 就是新建的 `LCObject`:

```cs
liveQuery.OnCreate = (obj) => {
print("对象被创建。");
};
```

#### `update` 事件

当有满足 `LCQuery` 查询条件的 `LCObject` 被更新时,`update` 事件会被触发。下面的 `obj` 就是有更新的 `LCObject`:

```cs
liveQuery.OnUpdate = (obj, updatedKeys) => {
print("对象被更新。");
};
```

#### `enter` 事件

当一个已存在的、原本不符合 `LCQuery` 查询条件的 `LCObject` 发生更新,且更新后符合查询条件,`enter` 事件会被触发。下面的 `obj` 就是进入 `LCQuery` `LCObject`,其内容为该对象最新的值:

```cs
liveQuery.OnEnter = (obj, updatedKeys) => {
print("对象进入。");
};
```

注意区分 `create` `enter` 的不同行为。如果一个对象已经存在,在更新之前不符合查询条件,而在更新之后符合查询条件,那么 `enter` 事件会被触发。如果一个对象原本不存在,后来被构建了出来,那么 `create` 事件会被触发。

#### `leave` 事件

当一个已存在的、原本符合 `LCQuery` 查询条件的 `LCObject` 发生更新,且更新后不符合查询条件,`leave` 事件会被触发。下面的 `obj` 就是离开 `LCQuery` `LCObject`,其内容为该对象最新的值:

```cs
liveQuery.OnLeave = (obj, updatedKeys) => {
print("对象离开。");
};
```

#### `delete` 事件

当一个已存在的、原本符合 `LCQuery` 查询条件的 `LCObject` 被删除,`delete` 事件会被触发。下面的 `objId` 就是被删除的 `LCObject` `objectId`:

```cs
liveQuery.OnDelete = (objId) => {
print("对象被删除。");
};
```

### 取消订阅

如果不再需要接收有关 `LCQuery` 的更新,可以取消订阅。

```cs
await liveQuery.Unsubscribe();
// 成功取消订阅
```

### 断开连接

断开连接有几种情况:

1. 网络异常或者网络切换,非预期性断开。
2. 退出应用、关机或者打开飞行模式等,用户在应用外的操作导致断开。

如上几种情况开发者无需做额外的操作,只要切回应用,SDK 会自动重新订阅,数据变更会继续推送到客户端。

而另外一种极端情况——**当用户在移动端使用手机的进程管理工具,杀死了进程或者直接关闭了网页的情况下**,SDK 无法自动重新订阅,此时需要开发者根据实际情况实现重新订阅。

### LiveQuery 的注意事项

因为 LiveQuery 的实时性,很多用户会陷入一个误区,试着用 LiveQuery 来实现一个简单的聊天功能。
我们不建议这样做,因为使用 LiveQuery 构建聊天服务会承担额外的存储成本,产生的费用会增加,后期维护的难度非常大(聊天记录、对话维护之类的代码会很混乱),并且云服务已经提供了即时通讯的服务。
LiveQuery 的核心还是提供一个针对查询的推拉结合的用法,脱离设计初衷容易造成前端的模块混乱。

</Conditional>

## 文件

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ import Path from "/src/docComponents/path";
| 名称 | 模块描述 |
| ------------------------ | ------------------------------------------------ |
| `LeanCloud-SDK-Storage` | 存储服务。 |
| `LeanCloud-SDK-Realtime` | 即时通信、LiveQuery 服务,依赖于存储服务|
| `LeanCloud-SDK-Realtime` | 即时通信依赖于存储服务|
| `LeanCloud-SDK-Engine` | 云引擎服务,依赖于存储,适用于云引擎服务端环境。 |

如只需使用某种服务,可下载最小依赖包,减小程序体积。
Expand Down
Loading

0 comments on commit f86592b

Please sign in to comment.