0

我在我的Cocoa Mac應用程序中有一個方法,它遍歷應用程序的PubSub Client中的所有訂閱源並將所有條目標記爲已讀。NSInvocationOperation問題

的邏輯看起來是這樣的......

NSArray *feeds = [[PSClient applicationClient]feeds]; 

for(PSFeed *feed in feeds) 
{ 
    for(PSEntry *entry in [feed entries]) 
    { 
     entry.read = NO; 
    } 
} 

如果有大量的未讀的飼料可能需要一段時間才能通過他們全部循環(相對而言)。我希望用戶能夠做其他事情,比如滾動文章,而其他內容正在後臺進行。所以我有一個NSInvocationOperation設置要調用的方法,像這樣......循環運行時

NSInvocationOperation *opr = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(markAllReadOperation) object:nil]; 
[que addOperation:opr]; 
[opr release]; 

應用程序仍然經歷嚴重放緩。而UI幾乎沒有反應。我是否錯過了NSInvocationOperation,或者我的邏輯本身就很慢?

回答

0

這聽起來像是一份工作...... Grand Central Dispatch!

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    [array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 
     [obj enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 
      [obj setRead:NO]; 
     }]; 
    }]; 
}); 

當然,大中央調度(和塊)分別在Mac OS X 10.6雙方出臺,因此,如果您需要支持舊版本的OS X.

+0

我沒有向後支持的問題,我計劃把它帶到Mac App Store ...所以用戶默認會有10.6。現在NSInvocationOpeartion無法做到這一點會有什麼改進?我的印象是,NSOperation只是在較高層次和較少層次上提供相同的功能。更新:我試過這個,但我仍然得到類似的缺乏UI響應,而該操作正在單獨的線程上運行。 – avizzini 2011-02-12 06:44:45

+0

這沒有任何意義......我還建議在樂器中進行分析以查看導致該塊的呼叫。 – 2011-02-12 17:56:03

0

如果您的用戶界面,可能無法使用沒有反應,那麼這聽起來像是在主線程上運行。你沒有使用mainQueue是嗎?

我認爲您最好的選擇是使用Instruments精確查看使用Time Profiler工具導致減速的代碼。