Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

删除国内数据存储 SDK V3 版本中 LiveQuery 相关描述 #1164

Merged
merged 1 commit into from
Sep 2, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading