RestKit, CoreData and Swift - I can't seem to fetch results back out

后端 未结 1 1998
Happy的楠姐
Happy的楠姐 2021-02-06 16:53

I have successfully set up a RestKit to CoreData mapping implementation in a new Swift-based app (currently XCode 6 beta 3). I know the import mappings are working from my RestK

1条回答
  •  走了就别回头了
    2021-02-06 17:21

    The answer is that apparently Swift does not like casting the fetch result as an optional. I have to put the result into a local variable and then set the optional:

    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;
    }
    

    Here is my setup and teardown of RestKit in Swift in case anyone (like niiamon) finds it helpful:

    From my 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
        ];
    }
    

    0 讨论(0)
提交回复
热议问题