RestKit, CoreData и Swift – я не могу получить результаты обратно

Я успешно настроил реализацию привязки RestKit к CoreData в новом приложении на основе Swift (в настоящее время XCode 6 beta 3). Я знаю, что сопоставления импорта работают из моего вызова RestKit JSON, потому что я могу проверить базу данных sqlite и увидеть мои данные. Однако я не могу получить данные из хранилища данных в NSFetchRequest. Что я делаю не так?

Я пощажу все настройки RestKit и срыв, потому что он довольно стандартный и, кажется, работает отлично. Итак, вот мой код запроса AppDelegate, который, похоже, не работает:

var currentUser: User? { if !_currentUser { var error: NSError? = nil let request = NSFetchRequest(entityName: "User") let recordCount = self.managedObjectContext.countForFetchRequest(request, error:&error) NSLog("user records found: \(recordCount)") var result = self.managedObjectContext.executeFetchRequest(request, error:&error) for resultItem : AnyObject in result { _currentUser = resultItem as? User if _currentUser { NSLog("Fetched User for \(_currentUser!.firstname) \(_currentUser!.lastname)") } } } return _currentUser; } 

self.managedObjectContext ссылается на это из моего AppDelegate, чтобы получить контекст из объекта shareObject RestKit:

 var managedObjectContext: NSManagedObjectContext { return RKObjectManager.sharedManager().managedObjectStore.mainQueueManagedObjectContext } 

Похоже, что запрос выборки является успешным, потому что точка останова в цикле for / in происходит. Однако, когда я проверяю объекты resultItem или _currentUser, они кажутся пустыми, и NSX «if _currentUser» никогда не срабатывает.

Есть идеи? Я делаю неправильные предположения о возвращении данных в Swift?

EDIT 2:

Проблема связана с моей попыткой привести объект resultItem в необязательный. Если объявить _currentUser без опции и удалить как? необязательный листинг запроса возвращает правильный объект пользователя:

  for resultItem : AnyObject in result { _currentUser = resultItem as User NSLog("Fetched User for \(_currentUser.firstname) \(_currentUser.lastname)") } 

EDIT: я добавил счетчик записей перед основным запросом на выборку и правильно отображает 1 запись. Так что что-то не так с тем, как я пытаюсь отобразить результат выборки в свой пользовательский объект. Вот мой класс пользователя:

 import Foundation import CoreData class User: NSManagedObject { @NSManaged var id: Int32 @NSManaged var createdAt: NSDate @NSManaged var udpatedAt: NSDate @NSManaged var username: String @NSManaged var email: String @NSManaged var firstname: String @NSManaged var lastname: String @NSManaged var organization: String @NSManaged var tokens: NSArray } 

Ответ заключается в том, что, по-видимому, Swift не любит отличать результат выборки как необязательный. Я должен привести результат в локальную переменную, а затем установить опцию:

 var currentUser: User? { if !_currentUser { var error: NSError? = nil let request = NSFetchRequest(entityName: "User") let recordCount = self.managedObjectContext.countForFetchRequest(request, error:&error) NSLog("user records found: \(recordCount)") var result = self.managedObjectContext.executeFetchRequest(request, error:&error) for resultItem : AnyObject in result { var currentUserItem = resultItem as User NSLog("Fetched User for \(currentUserItem.firstname) \(currentUserItem.lastname)") _currentUser = currentUserItem } } return _currentUser; } 

Вот моя настройка и отключение RestKit в Swift на случай, если кто-нибудь (например, niiamon) найдет полезным:

Из моего RestApi.swift:

 var objectStore: RKManagedObjectStore = RKManagedObjectStore() init() { configureRestKit() } func configureRestKit() { let objectManager = RKObjectManager(baseURL: NSURL.URLWithString(baseUrl)) //objectManager.requestSerializationMIMEType = RKMIMETypeJSON; RKObjectManager.setSharedManager(objectManager) objectStore = RKManagedObjectStore(managedObjectModel: managedObjectModel()) let dataPath = "\(RKApplicationDataDirectory())/MyApp.sqlite" NSLog("Setting up store at \(dataPath)") objectStore.addSQLitePersistentStoreAtPath(dataPath, fromSeedDatabaseAtPath: nil, withConfiguration: nil, options: optionsForSqliteStore(), error: nil) objectStore.createManagedObjectContexts() objectStore.managedObjectCache = RKInMemoryManagedObjectCache(managedObjectContext: objectStore.persistentStoreManagedObjectContext) objectManager.managedObjectStore = objectStore // -- Declare routes -- // // Login Route objectManager.addResponseDescriptor(userLoginResponseDescriptor()) objectManager.addResponseDescriptor(eventLoginResponseDescriptor()) objectManager.router.routeSet.addRoute(RKRoute(name:kUserLoginRouteName, pathPattern: "/login", method: RKRequestMethod.POST)) } func tearDownRestKit() { // Cancel any network operations and clear the cache RKObjectManager.sharedManager().operationQueue.cancelAllOperations() NSURLCache.sharedURLCache().removeAllCachedResponses() // Cancel any object mapping in the response mapping queue RKObjectRequestOperation.responseMappingQueue().cancelAllOperations() // Ensure the existing defaultStore is shut down NSNotificationCenter.defaultCenter().removeObserver(RKManagedObjectStore.defaultStore()) RKObjectManager.setSharedManager(nil) RKManagedObjectStore.setDefaultStore(nil) } func userMapping() -> RKEntityMapping { let userMapping = RKEntityMapping(forEntityForName: "User", inManagedObjectStore: objectStore) var userDictionary = ["id": "id", "created_at": "createdAt", "updated_at": "updatedAt", "username": "username", "email": "email", "firstname": "firstname", "lastname": "lastname", "organization": "organization"] userMapping.addAttributeMappingsFromDictionary(userDictionary) let tokenMapping = RKEntityMapping(forEntityForName: "ApiToken", inManagedObjectStore: objectStore) tokenMapping.addAttributeMappingsFromArray(["token", "expiration"]) userMapping.addRelationshipMappingWithSourceKeyPath("tokens", mapping:tokenMapping) return userMapping } func userLoginResponseDescriptor() -> RKResponseDescriptor { let userResponseDescriptor = RKResponseDescriptor(mapping: userMapping(), method: RKRequestMethod.POST, pathPattern: "/login", keyPath: "user", statusCodes: NSIndexSet(index: 200)) return userResponseDescriptor } func managedObjectModel() -> NSManagedObjectModel { return NSManagedObjectModel.mergedModelFromBundles(nil) } func optionsForSqliteStore() -> NSDictionary { return [ NSInferMappingModelAutomaticallyOption: true, NSMigratePersistentStoresAutomaticallyOption: true ]; } 
  • Показать версию приложения на экране запуска с помощью Swift
  • Xcode 6 beta 6 - Элементы на главной панели рассказов исчезли / отключены
  • Swift - может печатать только адрес памяти объекта
  • Понимание значения переходов UIViewController
  • UISearchBar отключить анимацию
  • Только UIScrollView AutoLayout только для вертикали
  • Как установить requestSerializer в Alamofire
  • Как исправить панель поиска табличного представления, перекрывающуюся со строкой состояния
  • Swift tab bar view prepareforsegue
  • Как повернуть изображение навигации в соответствии с пользовательским направлением в MKMapView?
  • Постепенно меняйте цвет фона в Swift
  • Interesting Posts

    Как изменить значение ограничения отношения к формату из кода?

    «Вызов одного экземпляра диспетчера представлений более одного раза не поддерживается» исключение

    В чем разница между NSURLSessionDataTask и NSURLSessionDownloadTask

    Очистка контекста в базовых данных: сброс и удаление зарегистрированных объектов?

    Обновить / Обновить в Swift

    Ошибка «CALayerInvalidGeometry» на iPad с iOS6 (Phonegap)

    CoreAudio: полифония подразделения Ausampler

    iOS Screenshot / App Recording Techniques

    Как повернуть представление в контроллере, которому не разрешено вращать его интерфейс?

    iOS: полностраничное межстраничное объявление показывает черный экран после закрытия

    Почему устройства iOS, работающие в службе BLE GATT в периферийном режиме, не обнаружены в Windows (и Windows RT) 8 и 8.1

    Добавление визуального эффекта в SKSpriteNode при нажатии

    Лучший способ разработки простого приложения для видеочата для Android и iOS

    Изображение на ячейках не полностью влево

    Символизирующие отчеты о сбоях iPhone App

    Давайте будем гением компьютера.