2016-12-06 77 views
0

我有一個獲取請求,我想使用結果來通知其他功能。抓取是在另一個函數中使用函數的輸出?

func getExercises() { 

    guard let managedObjectContext = managedObjectContext else { return } 
    let userExercise = UserExercise(context: managedObjectContext) 

    let request: NSFetchRequest<UserExercise> = UserExercise.fetchRequest() 
    request.predicate = NSPredicate(format: "usersroutine == %@", self.routineName) 
    do { 
     let appDelegate = UIApplication.shared.delegate as! AppDelegate 
     let context = appDelegate.persistentContainer.viewContext 
     let queryResults = try context.fetch(request) 
     print ("num of results = \(queryResults.count)") 
      for exercise in queryResults as [NSManagedObject] { 
     print("Exercise NAME: \(exercise.value(forKey: "name"))") 
     } 
    } catch { 
     print("Error with request: \(error)") 
    } 

其他功能(添加首都其中id所要的輸出定):

func configure(_ cell: TodaysRoutineTableViewCell, at indexPath: IndexPath) { 
    let userExercise = THE GET EXERCISE FUNCTIONS OUTPUT(at: indexPath) 

和另:

fileprivate func updateView() { 
    var hasUserExercises = false 
    if let UserExercise = THE GET EXERCISE FUNCTIONS OUTPUT { 
     hasUserExercises = UserExercise.count > 0 
    } 

我想也許ID只需添加queryResults在那裏,它會很好,但作爲本地功能,我只是得到錯誤。什麼是實現這一目標的正確方法?

更新,以顯示錯誤的圖像

enter image description here

// MARK: - COREDATA FETCH 

func getExercises(completion: (([NSManagedObject]?, NSError?) -> Void)?) { 

    guard let managedObjectContext = managedObjectContext else { return } 
    let userExercise = UserExercise(context: managedObjectContext) 

    let request: NSFetchRequest<UserExercise> = UserExercise.fetchRequest() 
    request.predicate = NSPredicate(format: "usersroutine == %@", self.routineName) 

    do { 
     let appDelegate = UIApplication.shared.delegate as! AppDelegate 
     let context = appDelegate.persistentContainer.viewContext 

     let exercises: [NSManagedObject]? 

     do { 
      let queryResults = try context.fetch(request) 
      print(queryResults) 

      for exercise in queryResults as [NSManagedObject] { 
       print("Exercise NAME: \(exercise.value(forKey: "name"))") 
      } 
      completion(exercises, nil) 

     } catch { 
      print("Error with request: \(error)") 
      completion(exercises, error) 
     } 
    } 
} 

回答

0

被取東西,你可以在一個異步的方式做的,正確的方法是使用一個完成的塊(回調)。

所以你getExercises功能可以有一個完成的塊參數,例如:

func getExercises(completion: ((exercises: [String], error: NSError?) -> Void)?) 

然後,當你的數據是getExercises函數裏面準備好了,你可以調用完成塊如下:

completion?(exercises, error) 

完成之前的這個問號是因爲完成塊是一個可選參數,所以你可以傳遞這個塊或不傳遞給你。

Swift 3可能需要一些更新,只需檢查完成塊的語法。

編輯:您將需要通過一個封閉爲您getExercises功能的參數時,你怎麼稱呼它:

getExercises(completion: { (exercises, error) in 
    //Do what you want with the result, this is the result of getExercises 
    print(exercises) 

})

現在,裏面getExercises你將結果傳遞給你的關閉:

func getExercises() { 
    // ... 
    do { 
     // ... 
     completion(exercises, nil) 
    } catch { 
     print("Error with request: \(error)") 
     completion?([], error) 
    } 
} 

練習將是某種類型,不知道你在那裏處理什麼,我放置了一個arr以字符串ay爲例。

+0

我嘗試過這些並用屏幕截圖更新OP,我只是有大量的錯誤?對不起,如果我做了一個愚蠢的錯誤,即時編寫這些funcs的新手 – infernouk

+0

對不起,你有第一個錯誤是由於Swift 2和Swift 3之間的差異。你可以在參數名稱之前加上「_」或刪除這個論點,讓我們只是這個類型。 關於第二個問題,您需要將您想要的數據傳遞給您的關閉。您還需要將閉包傳遞給getExcercise方法。我正在用一個例子編輯答案。 – fray88

+0

謝謝,我很困惑作爲一個獲取將返回實體結果對象而不是數組的字符串?也許我誤解了 – infernouk

0
  1. 使用未解決的識別符的「練習」

基於第一誤差是,你已經使用了屬性exercises這是已在圖像中示出的代碼,原因爲你尚未宣佈。您的completion中的exercises將無法​​在該函數內訪問。它需要傳遞給該閉包的參數。

當您調用完成塊時,您必須將NSManagedObject的數組傳遞給您在獲取結果後構建的數組。在你的情況下,在該循環中構建一個數組,並在該循環之後調用完成塊。

let exercises: [NSManagedObject]? 

do { 
    let queryResults = try context.fetch(request) 
    print(queryResults) 

    for exercise in queryResults as [NSManagedObject] { 
     //Using the result, build the exercises array here 
    } 

    completion(exercises, nil) 
} catch { 
    print("Error with request: \(error)") 
    completion(exercises, error) 
} 
  • 無不與預期參數類型兼容 '[NSManagedObject]'
  • 這是因爲exercises參數不是一個可選的,但你正在通過nil它。您必須將exercises參數設置爲可選,以同時採用非零值和零值。你的方法的簽名更改爲以下:

    func getExercises(completion: ((exercises: [NSManagedObject]?, error: NSError?) -> Void)?) 
    

    注:確保妥善處理nil在完成關閉你傳遞給getExercises功能。

    +0

    感謝我試圖實現這一點,但仍然有一堆錯誤,我用圖像更新了OP,以顯示我的代碼和錯誤 – infernouk

    +0

    如果您可以將該函數作爲代碼發佈,編輯會很有幫助。 –

    +0

    添加下方的代碼圖像謝謝 – infernouk

    相關問題