作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试将 Dart 与 sqlite 一起使用,这个项目 dart-sqlite .
但是我发现了一个问题:它提供的API是同步风格的。代码将如下所示:
// Iterating over a result set
var count = c.execute("SELECT * FROM posts LIMIT 10", callback: (row) {
print("${row.title}: ${row.body}");
});
print("Showing ${count} posts.");
native
这里的功能:
https://github.com/sam-mccall/dart-sqlite/blob/master/lib/sqlite.dart#L238
_prepare(db, query, statementObject) native 'PrepareStatement';
_reset(statement) native 'Reset';
_bind(statement, params) native 'Bind';
_column_info(statement) native 'ColumnInfo';
_step(statement) native 'Step';
_closeStatement(statement) native 'CloseStatement';
_new(path) native 'New';
_close(handle) native 'Close';
_version() native 'Version';
Completer
可以将回调样式转换为future样式,这可以让我使用Dart的
doSomething().then(...)
而不是传递回调函数。
callback
不是基于事件的:
int execute([params = const [], bool callback(Row)]) {
_checkOpen();
_reset(_statement);
if (params.length > 0) _bind(_statement, params);
var result;
int count = 0;
var info = null;
while ((result = _step(_statement)) is! int) {
count++;
if (info == null) info = new _ResultInfo(_column_info(_statement));
if (callback != null && callback(new Row._internal(count - 1, info, result)) == true) {
result = count;
break;
}
}
// If update affected no rows, count == result == 0
return (count == 0) ? result : count;
}
Completer
,它不会提高性能。我想我可能必须重写 c++ 代码以使其首先基于事件。
最佳答案
您应该能够在不接触 C++ 的情况下编写包装器。看看如何在 dart:async 中使用 Completer 类。基本上你需要创建一个 Completer,立即返回 Completer.future,然后从现有回调中调用 Completer.complete(row)。
回复:更新。你见过这个article ,特别是关于异步扩展的一点?即,如果 C++ API 是同步的,您可以在单独的线程中运行它,并使用消息传递与其通信。这可能是一种方法。
关于sqlite - 如何将 dart-sqlite 代码从同步样式更改为异步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21631208/
我是一名优秀的程序员,十分优秀!