2016-04-02 31 views
1

我正在嘗試做某事也許很奇怪,但我與以下問題堆棧。異步關閉變量的結構函數

我有一個結構與閉包屬性,我設置異步函數。

我想要的是,調用這個異步函數來獲取返回值。

我可以用解決方法來解決這個問題,但我想用正確的方法來解決這個問題。

任何幫助表示讚賞。

這裏是我的代碼:

struct Item { 
    var myselector: (String -> Void)? 
    func getMeThat(completion: String -> Void) { 
    completion(myselector()) // error: cannot call value of non-function type String -> Void 
    } 
} 

class API { 
    class func requestThing(completion: String -> Void) { 
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(2 * Double(NSEC_PER_SEC))), dispatch_get_main_queue(), { 
     completion("Kenan") 
    }) 
    } 
} 

class ViewController { 
    func viewDidLoad() { 
    var item = Item() 
    item.myselector = { // error: cannot assign value of type() ->() to type String -> Void 
     API.requestThing({ (str: String) in 
     <#code#> 
     }) 
    } 
    item.getMeThat({ (rtn: String) in 
     print(rtn) 
    }) 
    } 
} 
+0

可否請您直接編輯的錯誤信息到你的問題,而不是一個屏幕截圖? – NobodyNada

回答

2

的主要問題是,你有你的簽名小姐比賽由於一個奇怪的重複。

您正在將閉包設置爲結構的變量,但也提供了函數的完成。做一個或另一個。

struct Item { 
    func getMeThat(completion: String -> Void) { 
     API.requestThing(completion) 
    } 
} 

class API { 
    class func requestThing(completion: String -> Void) { 
     dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(2 * Double(NSEC_PER_SEC))), dispatch_get_main_queue(), { 
      completion("Kenan") 
     }) 
    } 
} 

class ViewController { 
    func viewDidLoad() { 
     let item = Item() 
     item.getMeThat({ (rtn: String) in 
      print(rtn) 
     }) 
    } 
} 

如果你只是想拖延的代碼的執行,這是你怎麼做

struct Item { 
    var myselector: (Void -> Void)? 
    func executeSelector() { 
     guard let sel = myselector else { 
      return 
     } 

     sel() 
    } 
} 

class API { 
    class func requestThing(completion: String -> Void) { 
     dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(2 * Double(NSEC_PER_SEC))), dispatch_get_main_queue(), { 
      completion("Kenan") 
     }) 
    } 
} 

class ViewController { 
    func viewDidLoad() { 
     var item = Item() 
     item.myselector = { 
      API.requestThing({ (str: String) in 
       print(str) 
      }) 
     } 
     item.executeSelector() 
    } 
} 
+0

謝謝你的回答。你是對的,但我想將該函數設置爲一個變量,並在其他地方調用它。如果函數不必是異步的,它將與這個架構一起工作。 –

+0

我不明白異步是如何產生問題的,您需要在異步調用返回時在閉包中捕獲您需要仍然存在的項目。閉包最終由dispatch_after閉包捕獲,因此它在那個時刻仍然存在,它自身捕獲的所有內容。 –

+0

Yess。你的第二個答案恰好符合我想要的。非常感謝你的努力。 –