ios - 在 Swift 中从 CoreData 获取值

标签 ios core-data swift

我正在尝试从 CoreData 中提取并打印两个值。一是速度,二是度数。然而事情并没有按计划进行。首先,这是代码的一部分:

  // Start fetching from CoreData

            request = NSFetchRequest(entityName: "WindData")

            request.returnsObjectsAsFaults = false

            results = context.executeFetchRequest(request, error: nil)

            if results!.count > 0 {

                for result: AnyObject in results! {

                    println(result)
                    println(result.speed)
                    println(result.degrees)


                }
            }
            else {
                println("No data")
            }

当我简单地打印结果时,我得到了值:

<NSManagedObject: 0x7f944a734e80> (entity: WindData; id: 0xd000000000740000 <x-coredata://762EB8C2-DDCF-43F5-8DFC-FAB9A29532E1/WindData/p29> ; data: {
degrees = 190;
speed = 8; })

println(result.speed) 在控制台中写入:2.34181e-38 并且 println(result.degrees) 不允许我编译并告诉我 AnyObject 没有名为 degrees 的成员(尽管它显然有)

对于任何菜鸟错误,我深表歉意,这是我第一次在 Stackoverflow 上发帖。

完整代码如下:

    //
//  ViewController.swift
//  KitesurfioApp
//
//  Created by Lasse Kristensen on 24/10/14.
//  Copyright (c) 2014 Lasse Kristensen. All rights reserved.
//

import UIKit
import CoreData

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()


        // Set logo in nav bar

        navigationItem.titleView = UIImageView(image: UIImage(named: "logo"))



        // Global save values

        var appDel: AppDelegate = UIApplication.sharedApplication().delegate as AppDelegate

        var context: NSManagedObjectContext = appDel.managedObjectContext!



        // JSON Fetching

        let urlPath = "http://api.openweathermap.org/data/2.5/weather?lat=55.564120&lon=12.568605"

        let url = NSURL(string: urlPath)

        let session = NSURLSession.sharedSession()

        let task = session.dataTaskWithURL(url!, completionHandler: {data, response, error -> Void in

            if (error != nil) {
                println(error)
            }
            else {


                // Delete old entries in CoreData

                var request = NSFetchRequest(entityName: "WindData")

                request.returnsObjectsAsFaults = false

                var results = context.executeFetchRequest(request, error: nil)

                for result in results! {

                    context.deleteObject(result as NSManagedObject)
                    context.save(nil)

                }

                // Start fetching JSON


                let jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as NSDictionary


                var item = jsonResult["wind"] as NSDictionary

                var degrees:Int = item["deg"] as NSInteger
                var speed:Float = item["speed"] as Float


                // Start saving JSON

                var newItem = NSEntityDescription.insertNewObjectForEntityForName("WindData", inManagedObjectContext: context) as NSManagedObject

                var speedValue:NSNumber = speed as NSNumber
                var degreesValue:NSNumber = degrees as NSNumber

                newItem.setValue(speedValue, forKey: "speed")
                newItem.setValue(degreesValue, forKey: "degrees")

                context.save(nil)



            }

        })

        task.resume()

        // Start fetching from CoreData

        var request = NSFetchRequest(entityName: "WindData")

        request = NSFetchRequest(entityName: "WindData")

        request.returnsObjectsAsFaults = false

        var results = context.executeFetchRequest(request, error: nil)

        if results!.count > 0 {

            for result: AnyObject in results! as [WindData] {

                println(result)
                println(result.speed)

            }
        }
        else {
            println("No data")
        }


    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}

最佳答案

您需要将 AnyObject 转换为具有 degree 等属性的类。AnyObject 不知道您需要的类属性将数组 [AnyObject] 向下转换为您的类数组

for result in results! as [NSManagedObject] {

    println(result)
    println(result.valueForKey("speed")!)
    println(result.valueForKey("degrees")!)
}

关于ios - 在 Swift 中从 CoreData 获取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26545621/

相关文章:

ios - 为导航栏添加标题和副标题,类似于 IOS 11 中的 Apple Music

ios - 如何从 iOS 发送上游 FCM 消息?

cocoa - 如何判断我的 NSManagedObject 是否驻留在只读 NSPersistentStore 中?

iphone - 将 iPad 应用程序中的文本数据保存为可以从 "notes app"打开的注释?

swift - 没有 GameScene.swift 或 GameScene.sks 文件

objective-c - setContentOffset:animated:之后滚动被禁用,我在做什么错?

ios - 核心数据读写顺序

ios - 中心 UIView 没有重叠不同大小的邻居 View ?

swift - 未调用 CKQueryOperation 上的 recordFetchedBlock

iphone - 在 iOS 上将 CollectionView Cells 紧紧地打包在一起?