我有大约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)")
}
}
答案 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