【问题标题】:SQLite3 query in UIView draw(_:) not working with CATiledLayerUIView draw(_:) 中的 SQLite3 查询不适用于 CATiledLayer
【发布时间】:2018-08-12 15:21:07
【问题描述】:

虽然可以在 UIView draw(_:) 中读取数据,但当 UIView 层设置为 CATiledLayer 时就不行了。代码如下(使用 CATiledLayer 时给出“Thread 4: EXC_BAD_ACCESS (code=1, address=0x7fcc95b1d170)”):

class Test2: UIView{
var points = [String]()

override init(frame: CGRect){
    super.init(frame: frame)

    let fileURL = try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false).appendingPathComponent("DB.sqlite")
    if sqlite3_open(fileURL.path, &db) == SQLITE_OK{
        print(fileURL.path)
    }
    else{
        print("error opening database")
    }
}
required init?(coder aDecoder: NSCoder){
    super.init(coder: aDecoder)
}

//Thread 4: EXC_BAD_ACCESS (code=1, address=0x7fcc95b1d170) when the following is used
//override class var layerClass: AnyClass{
//    return CATiledLayer.self
//}


func read(tile: String){
    var stmt:OpaquePointer?
    points = []
    let queryString = "SELECT * FROM Map WHERE tile = '\(tile)'"
    if sqlite3_prepare(db, queryString, -1, &stmt, nil) != SQLITE_OK{
        let errmsg = String(cString: sqlite3_errmsg(db)!)
        print("error preparing read: \(errmsg)")
        return
    }
    while(sqlite3_step(stmt) == SQLITE_ROW){
        points = String(cString: sqlite3_column_text(stmt, 2)).components(separatedBy: ",")
    }
}

override func draw(_ rect: CGRect){
    read(tile: "110_100")
     print(points)
}

}

【问题讨论】:

    标签: swift uiview sqlite drawrect catiledlayer


    【解决方案1】:

    我找到了答案。可能问题是在使用CATiledLayer时,“在一个或多个后台线程上调用了图层的draw(in:)方法”(https://developer.apple.com/documentation/quartzcore/catiledlayer),而SQLite“无法处理多线程情况”(https://www.yudiz.com/which-database-type-should-i-follow-in-my-ios-application

    【讨论】:

      猜你喜欢
      • 2012-09-04
      • 2012-01-04
      • 2019-10-16
      • 2017-03-19
      • 2013-09-21
      • 2021-05-22
      • 2018-02-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多