Parse SDK 已经正在成为Mobile平台上 Parse 开发的首要一部分。作为 Parse 开发者,你已经从其地下的 API 上了解了 Parse,可是今天我们开源了这个 SDK 以便于你了解其内部Task机制。
本文中, 我们将解密构建 Parse SDKs 时最具应战性的一面— 构造异步的 API,解耦架构,和完成API 一致性。在接下来的几周内, 我们会公布一系列博客来深化引见 SDKs 的特点。
其它翻译版本 (1) 加载中一些 Parse SDK 中的首要功用包括搜集通信,数据存储,和前去数据给开发者用于更新其 UI。一切这些都必须在异步中履行,分别于主线程并行。知道了这些你该当不会惊讶于我们的 SDK 中最首要的部分炊然是怎样做异步编程。旧年,我们公布了 Tasks,作为 Bolts 的一部分,这是一个基于约定的拼装起来的库,其简化了并行性与并发性。我们提到这个是因为我们在内部应用其来处置一些并发问题,但你现在可以看它的扩展部分。
我们一切内部的 API 几乎都是基于Task的。我们用其来简化异步操作的串行实行,比如在Server上保持一个 ParseObjects 的依托链,同时简化并行异步操作,比如保持非关联 ParseObjects 的分支结构。 这已经弱小到我们可以将这两个拼接到单个异步操作中了。
/** * Saves a collection of objects in serial batches of leaf nodes. */public Task<Void> deepSaveAsync(List<ParseObject> objects) { if (hasCycle(objects)) { return Task.forError(new RuntimeException(“Unable to save a ParseObject with a relation to a cycle”)); } Task<Void> task = Task.forResult(null); List<ParseObject> remaining = new ArrayList<>(objects); while (remaining.size() > 0) { List<ParseObject> batch = collectLeafNodes(objects); remaining.removeAll(batch); // Execute each batch operation serially, awaiting until // the previous has completed. task = task.onSuccessTask((t) -> { return saveAllAsync(batch); }); } return task;}/** * Saves batches of objects in parallel. */public Task<Void> saveAllAsync(List<ParseObject> objects) { if (objects.size() > MAX_BATCH_SIZE) { // The collection of objects is too big for a single batch, // so partition the collection and execute each batch // in parallel. List<List<ParseObject>> partitioned = Lists.partition(objects, MAX_BATCH_SIZE); List<Task<Void>> tasks = new ArrayList<>(); for (List<ParseObject> partition : partitioned) { tasks.add(saveAllAsync(partition); } return Task.whenAll(tasks); } return executeBatchCommand(objects);}// * Abridged, for clarity
颠末 Tasks 编写异步 API 是一件轻而易举的任务,并且我们非常建议您深化了解 Bolts 框架:Android, iOS/OS X 和我们的SDKs:Android,iOS/OS X。
尽可能的延续 Parse SDK 的轻易易用的传统是我们最优先的选择。可是,多么做很难既添加新的功用,还要让我们的 SDK 越发动摇而不去修改传统。别的,由于我们代码级的增加,为了给我们的开发者公布最动摇的版本,我们需求确保我们的代码可测试。
为了处置一切的这些问题,我们采取了解耦架构模块,包括我们的地下的APITools实例,Tools形状,操纵者和REST协议。每块都被封装了,是为了确保管眷分别和容许我们添加新功用的不合完成而不用修改太多的代码。这是一切模块怎样在一同Task的示例图
我们得解耦架构模块
Tools实例是容许我们保持一个易用的和波动的 API 的片段,关于 ParseObject 来说是容纳属性的 set,get 方法和保管,取得和删除方法的 API 表面层,只需我们保持多么的残缺性,我们可以在底层重构和添加新的功用而没有任何破坏性的修改。
形状触及Tools的内部形状的组合,对 ParseObject 来说,形状是指当前自身在Server上的表示和在外地运转的变卦的凑集,也指在外地的形状的当前表示的缓存.
这些形状实例也定义了在Tools实例和操纵层交互里的接口。Tools实例传递它的形状给操纵器,操纵器前去一个新的形状,然后Tools实例用这个新的形状更新自身。
操纵器定义了可在每个 Parse 类型上实行的一切举动:ParseObject 可以被保管、取得与删除,ParseQuery 可以被查找与计数,ParseFile 可以被保管与取得。
基础操纵器将序列化或反序列化Tools形状至公共的 REST 格式并且传送一切的央求给内部逻辑搜集。 这就防止我们因为完成不必要的序列化和反序列化,而使得实例与形状完成得越发复杂,同时供应了更好测试的代码拔出。
我们也设计了操纵器的可扩展性来使除 Parse 通信的其它功用能被添加。其中的实例就是部分数据存储。关于这个新特点,我们可以创建别的一个 ParseQueryController 的完成,而不是颠末 Parse 在搜集上通信。这就需求这些Tools在外地配备上。
本文中的一切译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接。 2KB翻译Task依照 CC 协议,假设我们的Task有侵犯到您的权益,请及时联系我们。2KB项目(www.2kb.com,源码交易平台),提供担保交易、源码交易、虚拟商品、在家创业、在线创业、任务交易、网站设计、软件设计、网络兼职、站长交易、域名交易、链接买卖、网站交易、广告买卖、站长培训、建站美工等服务