核心数据需要太多时间

时间:2015-06-01 09:18:52

标签: ios swift core-data

我有大约200,000个四个字母的单词,我想在我的应用程序中使用它。我不想在我的应用中将其用作CSV文件。所以我现在使用核心数据。现在我只是第一次在应用程序启动时将所有这些值加载到核心数据。我会在一段时间后检索这些值。

所以这个程序太多时间,我认为超过20秒。我只想访问一个单词,我只是想知道核心数据中是否已经存在一个单词,除了循环遍历整个数组之外,还有其他方法可以做到这一点。

简单地说,我想检查核心数据中是否存在单词,我也希望通过整数索引访问单词,我不想遍历所有对象。还有别的办法吗?我想在几分之一秒内做到这一点。我怎么能加载20万字。在我的应用中,从CSV读取需要2分钟以上。有关将字符串数组导入核心数据的建议吗?

这是我在项目中使用的代码。

 // Save it into CoreData


    func saveName()
    {

        //1 Getting AppDelegate

        let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate

        let managedContext = appDelegate.managedObjectContext!

        //2 Fetching Entity Description by corresponding entityName

        let entity =  NSEntityDescription.entityForName("Content", inManagedObjectContext: managedContext)

        let tempManagedObject = NSManagedObject(entity: entity!, insertIntoManagedObjectContext:managedContext)

        //3 Setting Values for managedObject


        for input in self.fourLetterWords
        {
            tempManagedObject.setValue(input, forKey: self.kMainAttributeName)
        }

        //4

        var error: NSError?

        if !managedContext.save(&error)
        {
            println("Could not save \(error), \(error?.userInfo)")
        }
    }

    //MARK: - Showing Values From Core Data

    func showOutput()
    {
        var myArray : Array<String> = []

        //1
        let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate

        let managedContext = appDelegate.managedObjectContext!

        //2
        let fetchRequest = NSFetchRequest(entityName: "Content")

        //3
        var error: NSError?

        let fetchedResults =
        managedContext.executeFetchRequest(fetchRequest,
            error: &error) as! [NSManagedObject]?

        if let results = fetchedResults
        {
            for inputObject in results
            {
                if let value : String = inputObject.valueForKeyPath(self.kMainAttributeName) as? String
                {
                    myArray.append(value)
                }
            }
        }
        else
        {
            println("Could not fetch \(error), \(error!.userInfo)")
        }
    }

2 个答案:

答案 0 :(得分:0)

跳过循环所需的最重要的方法是: -

1 .filteredArrayUsingPredicate:

要搜索使用此功能: -

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY SELF CONTAINS %@", search];

只需浏览此Apple doc,它一定会对您有帮助。

答案 1 :(得分:0)

  

在我的应用中,从CSV阅读需要2分钟以上。

这听起来不对。我构建了一个包含200,000个4个字母单词的文件。将它读入内存,用逗号分隔在我的iPhone 6上平均需要0.51秒。

文件:

xgnu,dkiw,reff,iebs,qhdh,eqeb,osxr,stac,qiaa,fliq,pmhs,zllt,…

我重复了这个任务10次

var array = Array<Double>()
for i in 0..<10{
    let bundle = NSBundle.mainBundle()
    let path = bundle.pathForResource("words", ofType: "csv")
    var text = String(contentsOfFile: path!, encoding: NSUTF8StringEncoding, error: nil)!


    let start = NSDate()
    self.allWords = text.componentsSeparatedByString(",")
    let stop = NSDate()
    let duration = stop.timeIntervalSinceDate(start)
    array.append(duration)
}

let total = array.reduce(0, combine: {$0 + $1})
let maxDuration = array.reduce(-Double.infinity, combine: { max($0, $1) })
let minDuration = array.reduce(Double.infinity, combine: { min($0, $1) })

let average = total / Double(array.count)


println("duration: \(total), average: \(average), min \(minDuration), max: \(maxDuration)")

结果:

duration: 5.14537298679352, average: 0.514537298679352, min 0.495729029178619, max: 0.524932980537415