2017-01-31 5 views
0

Я пытаюсь передать блок завершения на Objective-C API, но Xcode говорит построить не удалось из-за сигнала: Segmentation Fault: 11.Почему этот кусок кода не компилируется на Xcode 8.2.1

нарушитель линия, как представляется, в методе 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,[email protected]", 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,[email protected]", startingIndex: 0, requestedCount: 0, sortCritera: nil, completion: completion!) 

    } 

} 

Я сделал изолированный проект Xcode с библиотеками I'M U петь, чтобы вы могли попробовать.

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

ответ

0

Связался Apple, и они установили его в Xcode 8.3 бета 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) 
     } 
    } 
Смежные вопросы