2011-06-02 68 views
1

我想在後臺線程上創建一個CoreData獲取請求,以便爲用戶提供取消它的選項。在另一個線程上執行獲取請求

下面是我的後臺線程代碼:

- (void)searchDailyNotes 
{ 
    NSEntityDescription *entity = [NSEntityDescription 
      entityForName:@"DailyNotes" 
      inManagedObjectContext:self.managedObjectContext]; 

    NSString *searchString = [self.searchTextField stringValue]; 
    NSFetchRequest *fetchRequest= [[NSFetchRequest alloc] init]; 
    NSPredicate *predicate = [NSPredicate 
      predicateWithFormat:@"notes contains[cd] %@", searchString]; 
    [fetchRequest setEntity:entity]; 
    [fetchRequest setPredicate:predicate]; 

    NSError *error = nil; 
    [_dailyNotesArray addObjectsFromArray: 
      [self.managedObjectContext 
      executeFetchRequest:fetchRequest 
      error:&error]]; 

    NSLog(@"dailynotesArray count: %lu", [_dailyNotesArray count]); 
    if(error){ 
     [NSApp presentError:error]; 
    } 
    [fetchRequest release]; 
} 

問題:

  • 如果用戶希望取消搜索,這將是終止後臺線程的corrrect方式?
  • 如果我在managedObjectContext當前正在提取時中止線程,那麼分配fetchRequest會發生什麼情況?我會泄漏嗎?
+0

您可能會對此係列文章感興趣:http://www.cimgf.com/2011/05/04/core-data-and-threads-without-the-headache/ – 2011-06-02 15:53:16

回答

1

可可線程通常不包括強制線程中止的想法。你會看到cancel方法,但這是嚴格的建議。這個想法是,線程中的代碼會定期檢查這個狀態,並在請求取消時提前退出。例如,您會在NSThreadNSOperation中看到這一點。如果代碼不檢查取消請求,則cancel方法不起作用。

因此,如果您想要處理取消操作,則需要爲取消請求添加檢查。如果您看到要求取消,您可以在實際完成線程之前進行所需的清理。但是,無論如何您都不能中斷正在進行的獲取請求 - 一旦您調用了啓動它的方法,就等到它完成。

在另一張紙條上,您提取多久需要擔心這種情況?

相關問題