0

我正在尝试将完成块传递给 Objective-C API,但 Xcode 说由于信号而构建失败:分段错误:11。

违规行似乎在 browseAllFilesInRouter 方法中:

let completion = { (response: Dictionary<AnyHashable, Any>?, error: NSError?) in
        print("response")
    } as? UPPResponseBlock

device.contentDirectoryService().browse(withObjectID: "0", browseFlag: BrowseDirectChildren, filter: "dc:title,upnp:originalTrackNumber,res,res@duration", startingIndex: 0, requestedCount: 0, sortCritera: nil, completion: completion!)

这是完整的类,以获得更完整的参考:

import Foundation

class TVNetworkClient: NSObject, UPPDiscoveryDelegate {

    var routers: [UPPMediaServerDevice]
    var routerFileSystemTree: [UPPMediaItem]
    var searchTimer: Timer
    var completionBlock: ((_: [String: String], _: NSError) -> Void)?
    var notifyBlock: ((_: Bool, _: NSError) -> Void)?

    //MARK: - Initializers
    override init() {
        routers = []
        routerFileSystemTree = []
        searchTimer = Timer.scheduledTimer(withTimeInterval: 5.0, repeats: true) {
            _ in
            print("requesting data.")
            UPPDiscovery.sharedInstance().startBrowsing(forServices: "ssdp:all")
        }

        super.init()

        UPPDiscovery.sharedInstance().addBrowserObserver(self)
        searchTimer.fire()
    }

    convenience init(notify: @escaping (_: Bool, _: NSError) -> Void) {
        self.init()
        notifyBlock = notify
    }

    convenience init(completion: @escaping (_: [String: String], _: NSError) -> ()) {
        self.init()
        completionBlock = completion
    }

    //MARK: - Discovery Delegate
    func discovery(_ discovery: UPPDiscovery!, didFind device: UPPBasicDevice!) {
        if let server = device as? UPPMediaServerDevice {
            self.routers.append(server)
            self.browseAllFilesInRouter(device: server)
        }
    }

    func discovery(_ discovery: UPPDiscovery!, didRemove device: UPPBasicDevice!) {

    }

    //MARK: - Browse
    func browseAllFilesInRouter(device: UPPMediaServerDevice) {
        let completion = { (response: Dictionary<AnyHashable, Any>?, error: NSError?) in
            print("response")
        } as? UPPResponseBlock

        device.contentDirectoryService().browse(withObjectID: "0", browseFlag: BrowseDirectChildren, filter: "dc:title,upnp:originalTrackNumber,res,res@duration", startingIndex: 0, requestedCount: 0, sortCritera: nil, completion: completion!)

    }

}

我使用我正在使用的库制作了一个独立的 xcode 项目,因此您可以尝试一下。

https://drive.google.com/file/d/0By-7Jq4FK2KEcmRnS3lSVjdNcDA/view?usp=sharing

4

1 回答 1

0

联系了 Apple,他们在 Xcode 8.3 beta 2 中修复了它。

如果您仍然使用 Xcode 8.2.1,我发现了以下解决方法

当您使用尾随闭包语法直接在函数中传递闭包时,类型推断可以很好地工作:

device.contentDirectoryService().browse(withObjectID: "0", browseFlag: BrowseDirectChildren, filter: "", startingIndex: 0, requestedCount: 0, sortCritera: nil) { (response, error) in
        if let resp = response {
            print(resp)
        }
    }
于 2017-02-09T08:58:03.440 回答