Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Swift Movesense API订阅回调操作为零?_Swift_Movesense - Fatal编程技术网

为什么Swift Movesense API订阅回调操作为零?

为什么Swift Movesense API订阅回调操作为零?,swift,movesense,Swift,Movesense,我正在构建与Movesense api的快速集成,如下所示: 按照Movesense Showcase应用程序中给出的示例,我已订阅心率通知: let request = MovesenseRequest(resourceType: .heartRate, method: .subscribe, parameters: nil) let operation = device.sendRequest(request, observer: self) 我确信我的设备已连接并正常工

我正在构建与Movesense api的快速集成,如下所示:

按照Movesense Showcase应用程序中给出的示例,我已订阅心率通知:

let request = MovesenseRequest(resourceType: .heartRate, method: .subscribe,
    parameters: nil)

    let operation = device.sendRequest(request, observer: self)
我确信我的设备已连接并正常工作,因为我可以使用。get方法检索能量和温度信息,不会出现任何问题

问题是我没有收到来自Movesense API的任何心率响应。通过api,我陷入了send-request方法,其中onCompletion和OneEvent回调都有一个为零的操作,因此它在没有向我的应用程序发送响应的情况下死亡

internal func sendRequest(_ request: MovesenseRequest, serial: String,
                          observer: Observer) -> MovesenseOperation? {
    guard let mds = self.mdsWrapper,
          let jsonDecoder = self.jsonDecoder else {
        let error = MovesenseError.integrityError("MovesenseConnection::sendRequest error.")
        delegate?.onConnectionError(error)
        return nil
    }

    let resourcePath = "\(serial)/\(request.path)"
    let onCancel = {
        switch request.method {
            case .subscribe: mds.doUnsubscribe(resourcePath)
            default: return
        }
    }

    let operation = MovesenseOperationFactory.create(request: request,
                                                     observer: observer,
                                                     jsonDecoder: jsonDecoder,
                                                     onCancel: onCancel)

    // Decode response with the MovesenseOperation instance
    let onCompletion = { [connectionQueue, weak operation] (_ response: MDSResponse) in
        dump(response)
        guard let operation = operation else { return }
        connectionQueue.async {
            operation.handleResponse(status: response.statusCode, header: response.header,
                                     data: response.bodyData)
        }
    }

    switch request.method {
    case .get: mds.doGet(resourcePath, contract: request.contract, completion: onCompletion)
    case .put: mds.doPut(resourcePath, contract: request.contract, completion: onCompletion)
    case .post: mds.doPost(resourcePath, contract: request.contract, completion: onCompletion)
    case .del: mds.doDelete(resourcePath, contract: request.contract, completion: onCompletion)
    case .unsubscribe: mds.doUnsubscribe(resourcePath)
    case .subscribe:
        let onEvent = { [connectionQueue, weak operation] (_ event: MDSEvent) in
            dump(event)
            guard let operation = operation else {
                mds.doUnsubscribe(resourcePath)
                return
            }

            connectionQueue.async {
                operation.handleEvent(header: event.header,
                                      data: event.bodyData)
            }
        }

        mds.doSubscribe(resourcePath, contract: request.contract,
                        response: onCompletion, onEvent: onEvent)
    }

    return operation
}

我知道API可以工作,因为存储库中的Movesense Showcase代码可以正常工作,但我不知道在设置请求时遗漏了什么,这样操作就不会每次都为零。是什么导致了这个错误?

我最终找到了自己的答案。问题是参考文献太弱。我没有将该操作存储在任何地方,因此在调用回调时,该操作始终为nil,因为引用是垃圾收集的。解决方案是将订阅请求返回的操作存储在某个位置,然后在取消订阅时删除引用。我个人使用地图来存储我的引用,但是任何保存引用的方法都可以