2015-12-29 3 views
0

В моем приложении я использую Core Data, чтобы хранить базовую информацию о пользователе и легко получить данные. Я создал класс Assistant, который имеет некоторые статические функции. Один из них заключается в следующем:Fetch Запрос метода выполнения ничего не возвращает

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") 
     } 

    } 

Он работает отлично и данные считываются правильно. Вот что вам нужно знать: я использую метод getName() в методе AppDelegateapplication(application:, didFinishLaunchingWithOptions launchOptions:). Так что может быть, что 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 является Array из AnyObject, а не только одного.

Для вашей функции 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

Смежные вопросы