2015-09-17 83 views
0

我使用Swift 1.2和ReactiveCocoa 3.0,SwiftyJSON 2.2.1和Alamofire 1.3.1。我正在建立一個被動的網絡管理員。爲什麼這些上下文變量不可見?

爲什麼以下方式不起作用?

func sendRequest(request: ApiRequest) -> SignalProducer<JSON, NSError> { 

    return SignalProducer { sink, disposable in 
     alamofireManager.request(request.method, request.url, parameters:request.parameters, encoding: .JSON).responseJSON 
      { (request, response, data, error) in 
       if let error = error { 
        // sendError(sink, error) 
       } else { 
        NSLog("Successful network request") 
        // sendNext(observer, JSON(data!)) 
        // sendCompleted(sink) 
       } 
     } 
    } 
} 

sendError,sendNext和sendCompleted不編譯。當他們註釋掉編譯器說:

Command /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swiftc failed with exit code 1 

調試時我看到水槽和一次性不可見的Alamofire閉包內。奇怪的事情:這曾經在幾個小時前工作。

回答

0

哇,經過幾小時的搜索,我找到了解決方案。

如果沒有明確指定給變量,看起來外層閉包不會保留變量(這裏是sink和一次性)。我這樣做是與

let sink = sink 

以下工作:

func sendRequest(request: ApiRequest) -> SignalProducer<JSON, NSError> { 
    return SignalProducer { sink, disposable in 
     let sink = sink 

     self.alamofireManager.request(request.method, request.url, parameters:request.parameters, encoding: .JSON).responseJSON 
      { (request, response, data, error) in 
       if let error = error { 
        sendError(sink, error) 
       } else { 
        sendNext(sink, JSON(data!)) 
        sendCompleted(sink) 
       } 
     } 
    } 
} 

也許任何人都可以解釋這一點更普遍?我認爲具有參數的外部閉包將在內部閉包內自動提供。可能這是swift編譯器中的一個錯誤?