NSInvocationOperation问题

时间:2011-02-12 05:24:52

标签: objective-c multithreading cocoa nsoperation nsoperationqueue

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

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

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

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

如果有大量未读的Feed,则可能需要一段时间才能循环显示它们(相对而言)。我希望用户能够做其他事情,比如滚动文章,而其他的东西在后台进行。所以我有一个NSInvocationOperation设置来调用方法,就像这样......

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

在循环运行时,应用程序仍然会遇到严重的减速。用户界面几乎没有反应。我错过了NSInvocationOperation的东西,还是我的逻辑本身就很慢?

2 个答案:

答案 0 :(得分: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,则可能无法使用。

答案 1 :(得分:0)

如果你的用户界面没有响应,那么听起来好像主线程上正在运行。您没有使用mainQueue是吗?

我认为您最好的选择是使用Instruments查看使用Time Profiler仪器确切导致速度减慢的代码。