我正在用Swift编写自己的SQLite Package 器,我想知道SQLite语句是否可以设置为Sendable
,或者将其设置为actor
是否更好。
import SQLite
struct Statement: Sendable {
private(set) var handle: OpaquePointer?
init(sql: String, connection: OpaquePointer) {
sqlite3_prepare_v2(connection, sql, -1, &handle, nil)
}
public func finalize() {
guard let handle else { return }
sqlite3_finalize(handle)
}
}
// Resulting in
let connection: OpaquePointer = ...
let statement = Statement(sql: "", connection: connection)
statement.finalize()
或使用执行元实现
import SQLite3
actor Statement {
private(set) var handle: OpaquePointer?
init(sql: String, connection: OpaquePointer) {
sqlite3_prepare_v2(connection, sql, -1, &handle, nil)
}
public func finalize() {
guard let handle else { return }
sqlite3_finalize(handle)
}
}
// Resulting in
let connection: OpaquePointer = ...
let statement = Statement(sql: "", connection: connection)
await statement.finalize()
我最感兴趣的是Sendable
对OpaquePointer
有何影响,以及actor
实现是否可能解决OpaquePointer
的潜在问题。SQLite语法让我相信它是“按引用传递”的,即使我假设语句可以或应该“按值传递”,因此我使用了struct Statement: Sendable
协议。我只是不确定这是否会奏效。
1条答案
按热度按时间ars1skjm1#
根据定义,
OpaquePointer
是引用类型(因为它是C指针)。关于通过参与者提供同步,SQLite有三个threading modes,iOS的默认设置是从多个线程使用数据库连接是安全的,但不能同时使用。所以,是的,你会想要用一个演员。