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工具导致减速的代码。