2

我是 Couchbase 和 Swift 的新手,我正在尝试建立一个候选架构并为我正在开发的新应用程序运行。我认为 Couchbase 非常适合,除了我无法让它在不崩溃的情况下工作。这可能归结为几个原因,但只是为了进行健全性检查,我只是想弄清楚这是否是我做错的事情。

每次调用 emit 函数时,以下映射函数都会导致 EXC_BAD_ACCESS 错误。该函数在启动时从视图控制器调用。我检查了调试器中的参数,它们指向内存中的有效引用。这是创建查询的函数:

  class func listEvents() -> CBLQuery? {
    if let view:CBLView = DatabaseService.sharedInstance.database.viewNamed("events") {
      if !view.mapBlock { //create the map block if it doesn't exist
        func mapBlock(doc: [NSObject: AnyObject]!, emit: ((key: AnyObject, value: AnyObject!) -> ())?) {
          if let type:AnyObject = doc["type"] {
            if type.isKindOfClass(NSString.self) && (type as String) == Event.docType() {
              if let key: AnyObject = doc["date"] {
                if let emitFunc = emit {
                  emitFunc(key: key, value: doc)
                }
              }
            }
          }
        }
        view.setMapBlock(mapBlock,
          reduceBlock: nil,
          version: "1")
      }
      return view.createQuery()
    }
    return nil
  }

我也尝试过用 Objective-C 重写整个函数并且它可以工作,所以如果没有人可以帮助我,那么我将把它归结为 Swift 中的一个错误。如果是,我想向 Apple 报告这个问题,但我对 Couchbase Mobile SDK 和 Swift 的工作原理的理解仍然非常有限。如果有人设法让 Couchbase Lite 与 Swift 一起工作,如果你能帮助我,那就太好了。或者更好的是,如果在 Github 上有一个用 Swift 编写的示例项目,那对我来说就是黄金。

4

2 回答 2

6

我没有写它,但这里有一个非常好的 swift couchbaselite 备忘单,其中包含视图。

https://github.com/zemirco/swift-couchbaselite-cheatsheet

于 2014-07-25T01:17:42.813 回答
1

感谢@gigq 指出Couchbase 和 Swift备忘单,我设法找出了我的错误。我没有使用内部函数,而是使用了一个似乎可以工作的闭包变量。我怀疑这与 Swift 在函数中捕获变量而不是闭包的方式有关,但我不能 100% 确定。

如果有人需要或感兴趣,这是工作代码:

class func listEvents() -> CBLQuery? {
    var view = DatabaseService.sharedInstance.database.viewNamed("events")

    if !view.mapBlock {
      var mapBlock: CBLMapBlock = { (doc: [NSObject: AnyObject]!, emit: CBLMapEmitBlock!) in
        if let type:AnyObject = doc["type"] {
          if type.isKindOfClass(NSString.self) && (type as String) == Event.docType() {
            emit(doc["date"], doc)
          }
        }
      }
      view.setMapBlock(mapBlock, version: "1")
    }
    return view.createQuery()
  }
于 2014-07-26T09:55:31.633 回答