2016-06-26 15 views
1

私はUITableviewを持っています。 (つまり、最後の5分以内に私のCoreDataに追加されました。)私は、項目エンティティに 'expire_date'というDate型のフィールドを持っています。私は、バックグラウンドで新しいアイテムをダウンロードすると、私は)NSDate(にEXPIRE_DATEを設定し、CoreDataに追加プラス5分:NSFetchedResultsController with> now()は、期限切れのエントリを更新しません。

let fetchRequest=NSFetchRequest(entityName: "Item") 
fetchRequest.predicate = NSPredicate(format: "expire_date > now()") 
let sortDescriptor = NSSortDescriptor(key: "expire_date") 
fetchRequest.sortDescriptors=[sortDescriptor] 
myFRC=NSFetchedResultsController(fetchRequest:fetchRequest, managedObjectContext:myMOC) 
do { 
    try myFRC!.performFetch() 
} catch { 
    print(error) 
} 

item.expire_date = NSDate(timeIntervalSince1970: NSDate().timeIntervalSince1970+5*60); 

NSFetchedResultsControllerのための私のセットアップは次のようになりますNSFetchedResultsControllerDelegateコードは、UITableViewを使用する場合のこのような種類の標準的な定型文です。

これはすべて、アプリを起動するときに効果的です:「タイムアウトしていない」既存の項目だけが表示されます。新しいアイテムが追加されたときにもうまくいきます。

問題は、リストの時間の項目が出て、それが結果から削除されないとき

誰でもどのようにこれを実現するために、任意のアイデアを持っているということでしょうか?

答えて

1

UITableViewで1つ以上のアイテムが選択されている可能性がありました。その選択を失いたくないので、残念ながらW.K.S.の回答を使用できませんでした。それは厳密に私が与えた情報から正しいと言っていましたが、アイテムが期限切れになった直後にリストを更新しませんでした。しかし、ワインは、私が欲しかったやり方で効果を発揮したアイデアを発しました。

アイテムが更新されたときにそのアイテムがクエリによって再検査されたように見えるので、期限切れのアイテムを更新することです。私はNSTimer変数を追加しました:

var timeoutTimer:NSTimer? 

私は機能、addMinimumTimeoutを(追加)(再)はタイムアウトタイマーを設定していること:

func itemTimedOut(timer:NSTimer) { 
    guard let item=timer.userInfo as? Item else { 
     return; 
    } 
    item.expire_date! = item.expire_date!; 
    do { 
     try item.managedObjectContext!.save(); 
    } catch { 
     let saveError = error as NSError; 
     print("Error saving: \(saveError)") 
     return; 
    } 
} 

func addMinimumTimeout() { 
    if let _timeoutTimer=timeoutTimer { 
     _timeoutTimer.invalidate(); 
     timeoutTimer=nil; 
    } 
    if myFRC?.fetchedObjects?.count==0 { 
     return; 
    } 
    if let firstItem = myFRC?.fetchedObjects?[0] as? Item { 
     let timeout=(firstItem.expire_date!.timeIntervalSince1970-NSDate().timeIntervalSince1970)+1.0; 
     timeoutTimer=NSTimer.scheduledTimerWithTimeInterval(timeout, target: self, selector: #selector(itemTimedOut), userInfo: firstItem, repeats: false); 
    } 
} 

マイitemTimedOutコードは次のようになります

次に、私のフェッチを実行した直後の私のviewDidLoadで、私は呼び出します:

addMinimumTimeout(); 

と、ボイラープレートコントローラ(コントローラ、didChangeObject、atIndexPath、forChangeType、newIndexPath)関数の最後にも追加します。

この方法では、リストに項目がない場合、タイムアウトタイマーは作成されませんが、追加されるとすぐにタイムアウトタイマーが作成されます。何らかの理由でアイテムが削除されると、タイマーが更新され、最後のタイムアウトがタイムアウトまたは削除された場合、タイムアウトタイマーは実行されません。

関連する問題