0

我在我的 Cocoa Mac 应用程序中有一个方法,它遍历我的应用程序的 PubSub 客户端中的所有订阅提要,并将所有条目标记为已读。

逻辑看起来像这样......

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];

循环运行时,应用程序仍然会严重减速。用户界面几乎没有响应。我是否缺少 NSInvocationOperation 的某些内容,或者我的逻辑本身就很慢?

4

2 回答 2

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];
        }];
    }];
});

当然,Grand Central Dispatch(和块)都是在 Mac OS X 10.6 中引入的,因此如果您需要支持旧版本的 OS X,它可能无法使用。

于 2011-02-12T06:35:00.800 回答
0

如果您的 UI 没有响应,那么听起来像是在主线程上运行了一些东西。你不使用mainQueue是吗?

我认为您最好的选择是使用 Instruments 来准确查看使用 Time Profiler 工具导致减速的代码。

于 2011-02-12T13:16:29.647 回答