2011-06-14 100 views
0

我沒有崩潰,而執行executeFetchRequest:錯誤:崩潰而執行讀取請求

MyApp[595]已經超出允許的時間活躍斷言:

{(
    <SBProcessAssertion: 0x1e5d1260> identifier: Suspending process: MyApp[595] 
permittedBackgroundDuration: 10.000000 reason: suspend owner pid:29 preventSuspend 
    preventThrottleDownCPU preventThrottleDownUI 

這是我的代碼:

NSString *predString = [NSString stringWithFormat:@"categoryId MATCHES '%@'", categoryId]; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:predString]; 
[request setPredicate:predicate]; 
NSError *error = nil; 
NSArray* objects = [context executeFetchRequest: request error: &error]; 

據我所知,在主線程中同步完成的獲取花費了太多時間,超過10秒,並且進程被暫停。

在瀏覽互聯網,我發現這個很好的解決方案,使獲取異步:

http://blog.zssz.me/2010/01/asynchronous-fetch-in-core-data.html

但我想知道如果我的實際的假設是正確的,如果有這個問題簡單的解決方案。 非常感謝。

回答

0

你不能使用MATCHES運算符與SQL存儲(你幾乎肯定使用),因爲sqlite不支持正則表達式。我本來期望它錯誤出來,而不是超時,但顯然不是。

您想使用CONTAINS或更好,==。如果您有一個名爲catergoryID的屬性,它通常表示具有特定唯一值的屬性,而不是具有很多細微變化的屬性。使用==/equals將產生更快的獲取。

+0

感謝TechZen。其餘案例不會錯誤,但會返回不正確的結果。我會改變它。你認爲無論如何都需要在後臺進行抓取? – toupper 2011-06-15 07:34:10

+0

除了非常大的數據集之外,通常沒有必要。此外,如果您要通過用戶界面獲取信息以向用戶顯示,您是否希望用戶繼續處理過時的信息?您可能不會在UI的背景中提取通常沒有任何用處。然而,真正的答案總是相同的:從最簡單的解決方案開始並對其進行壓力測試。只採用更復雜的解決方案是最簡單的解決方案經過測試並證明不足。 – TechZen 2011-06-15 15:05:05

+0

我明白了,非常感謝! – toupper 2011-06-16 11:51:39

0

錯誤是非常清楚:)

我會嘗試它在後臺線程,看看會發生什麼。