2015-12-29 70 views
0

在我的應用程序使用的核心數據,以保持有關用戶的一些基本信息,並輕鬆獲得的數據我創建了一個Assistant類具有爲此事一些靜態功能。其中之一是:獲取請求執行方法什麼都不返回

static func fetchData(forEntity name: String) -> AnyObject{ 

     var result: AnyObject! 

     let dataController = DataController().managedObjectContext 
     let fetchRequest = NSFetchRequest(entityName: name) 

     do{ 
      result = try dataController.executeFetchRequest(fetchRequest) 
     }catch{ 
      print("Failed to execute fetch request for \(name) entity") 
     } 
     print("Returning result: \(result.description)") 

     return result 
    } 

的問題是,當我使用它print("Returning result: \(result.description)")打印「返回結果:()」,它不是零,它只是一個空的AnyObject我承擔。無論如何,如果我然後用這種方法:

static func getName() -> String{ 

     let fetched = fetchData(forEntity: "UserData") as! [UserData] 

     if fetched.count > 0{ 
      print("Returning found value: \(fetched.first!.username!)") 
      return fetched.first!.username! 
     }else{ 
      print("Did not find any data, returning an empty string") 
      return "" 
     } 

    } 

它返回一個空字符串。但是,如果我在另一個類中使用以下方法:

func initialize(){ 

     do{ 
      let fetch = NSFetchRequest(entityName: "UserData") 
      let entities = try dataController.executeFetchRequest(fetch) as! [UserData] 
      if entities.count > 0{ 
       dispatch_async(dispatch_get_main_queue(), {self.fld_name.text = entities[0].username}) 
      }else{ 
       dispatch_async(dispatch_get_main_queue(), {self.fld_name.text = ""}) 
      } 
     }catch{ 
      print("Nope, nothing's here") 
     } 

    } 

它工作得很好,數據的正確讀取。 這裏有您需要知道:我在使用AppDelegateapplication(application:, didFinishLaunchingWithOptions launchOptions:)方法getName()方法。因此,它可能是,CoreData不會在那一刻正常工作(我嚴重懷疑)

好吧,這裏是我的假設:

  1. 也許這個問題的發生是因爲返回AnyObject,因此我失去了所有數據?
  2. 可能是因爲CoreData不是(以某種方式)在此時被激活?
  3. 這只是我犯的一些其他愚蠢的錯誤嗎?

請提出您的解決方案。先謝謝你!

回答

0

的問題是,我是每一個我需要獲取數據的時間創造DataController().managedObjectContext一個新實例,並以某種方式被越來越遠沒有得到任何的異常。我的解決方案(工作)是將一個實例放入委託並使用它。它的工作,但正如我所說,我不知道它爲什麼這樣,而不是其他。我爲我的無知抱歉,但我很高興,我只是固定它,並希望得到一個解釋,如果你能提供給我一個。

0

你有一些問題,可能導致麻煩。首先,我會重寫你的fetchData函數。

static func fetchData(forEntity name: String) -> [AnyObject] { 

    let dataController = DataController().managedObjectContext 
    let fetchRequest = NSFetchRequest(entityName: name) 

    do{ 
     let results = try dataController.executeFetchRequest(fetchRequest) 
     print("Returning result: \(results.description)") 
     return results 
    } catch { 
     print("Failed to execute fetch request for \(name) entity") 
     return [] 
    } 
} 

exexuteFetchRequest返回類型的AnyObject一個Array,不只是一個單一的一個。

爲了您getName()功能我會做到以下幾點。它使用如果讓綁定來安全地處理你的結果。

static func getName() -> String { 

    if let 
     fetched = fetchData(forEntity: "UserData") as? [UserData], 
     userData = fetched.first, 
     username = userData.username { 
     print("Returning found value: \(username)") 
     return username 
    } else { 
     print("Did not find any data, returning an empty string") 
     return "" 
    } 
} 

給它一個旋轉,看看是否有幫助。至少,如果出現任何問題,此代碼更安全並且不太可能崩潰。

+0

嗯,首先,你會得到一個警告,轉換AnyObject爲[AnyObject]是多餘的。問題是我不應該創建另一個ManagedObjectContext的實例。不過謝謝你的關注 – EBDOKUM