アルゴリズムに年の配列を渡し、辞書の形式で結果を期待している場合は、これを達成できます。毎年、そのオブジェクトに対応するオブジェクトのキーとして渡されます。その年の最も最近の車。
すなわち:
let years : [Int] = [2000, 2005]
//The ideal method:
func mostRecentFor<T>(years: [Int]) -> [String:T]
だけ検索年間の小さな番号を使用すると仮定し、データベースが車の数が少ないこと、あなたがスレッドを心配する必要はありません。それ以外の場合は、この方法では並行性を使用するか、フェッチのための専用スレッドを使用してメインスレッドをブロックしないようにする必要があります。テスト目的のために、必要はありません。
これを達成するには、次の行に沿った方法を使用します。
まず、他の回答が示唆しているように、その年に番号述語を使用する必要があります。あなたがNSPredicateの日付形式を使用します。このために :
NSPredicate(format: "date == %@", year)
あなたのモデルは、それゆえ、パラメータ別として、実際のnsdateとして年間持っている必要があります。次に、fecthLimit
パラメータを1に設定し、sortDescriptor
をnsDateキーパラメータに適用します。後の2つを組み合わせることで、指定された年の最年少または最古の値のみが返されます。我々は最初の値、実際に原因1のfetchLimit
値に戻ったものをしたいので、私たちが言った、今年の早い車、または最小と一つであることが、ここではtrue
にセットを昇順使用
func mostRecentFor(years: [Int]) -> [String:Car] {
let result : [String:Car] = [:]
for year in years {
let request: NSFetchRequest<CarModel> = CarModel.fetchRequest()
request.predicate = NSPredicate(format: "date == %@ AND name != nil", year)
request.fetchLimit = 1
let NSDateDescriptor: let sectionSortDescriptor = NSSortDescriptor(key: "nsDate", ascending: true)
let descriptors = [NSDateDescriptor]
fetchRequest.sortDescriptors = descriptors
do {
let fetched = try self.managedObjectContext.fetch(request) as
[CarModel]
guard !fetched.isEmpty, fetched.count == 1 else {
print("No Car For year: \(year)")
return
}
result["\(year)"] = new[0].resultingCarStruct //custom parameter here.. see bellow
} catch let err {
print("Error for Year: \(year), \(err.localizedDescription)")
}
}
return result
}
nsDateキーのタイムスタンプ。
これは、小さなデータストアとテストのための簡単なフェッチクエリを提供します。また、CarModelをCar structの対応部分に解釈するためのメソッドやパラメータを作成すると、CDからメモリオブジェクトに簡単に移動できます。
だからあなたはそうのようなあなたの車を探したい:
let years = [1985, 1999, 2005]
let cars = mostRecentFor(years: years)
// cars = ["1985": Car<year: 1985, name: "Chevrolet", nsDate: "April 5th 1985">, "1999" : Car<year: 1999, name: "Toyota Corolla", nsDate: "February 5th 1999">]
// This examples suggests that no cars were found for 2005
私はこれで三つの問題、あなたは何を意味するかを参照してください。1.このアプローチは、ディスクに非常に非常に遅いトンを、行きます。 2.この質問は年を重ねることを求めているわけではなく、毎年最新の車がほしいと思っています3.この答えは名前=!nilの状態を考慮に入れません。ありがとう。 – zumzum
1:私は、このアプローチが小さなdbをテストするのに適していると指定しており、それを何かのためのconcurencyラッパーに適合させる必要があると指定します。 2:「毎年」とは、1年間のコレクションから、2年の間の毎年までの何かを意味することができます。これは、少なくとも年の配列(またはこの場合は整数)になります。 3:確かに名前を忘れてしまい、nilをチェックするには、述語文字列にAND演算子を追加し、文字列内またはパラメタ表記のどちらかで回避値を追加します。病気のアップデート – murphguy
これは、質問が求めている答えを提供していません。ごめんなさい。 – zumzum