2017-01-31 1 views
0

Je suis en train de passer un bloc d'achèvement à une API Objective-C, mais Xcode dit construire échoué en raison du signal: Segmentation Fault: 11.Pourquoi ce morceau de code ne compile pas sur Xcode 8.2.1

la ligne incriminée semble être dans la méthode 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!) 

Voici la classe complète pour une référence plus complète:

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!) 

    } 

} 

J'ai fait un projet Xcode isolé avec les bibliothèques, je suis u chantez donc vous pouvez l'essayer.

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

Répondre

0

Contacté Apple et ils l'ont fixé dans Xcode 8.3 bêta 2.

J'ai trouvé la solution suivante si vous utilisez encore Xcode 8.2.1

Lorsque vous passez la fermeture directement dans le fonctionner avec la syntaxe de fermeture à la traîne, puis inférence de type fonctionne bien:

device.contentDirectoryService().browse(withObjectID: "0", browseFlag: BrowseDirectChildren, filter: "", startingIndex: 0, requestedCount: 0, sortCritera: nil) { (response, error) in 
     if let resp = response { 
      print(resp) 
     } 
    }