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

ループの実行中、アプリケーションは引き続き深刻な速度低下を経験します。また、UI はほとんど反応しません。NSInvocationOperation で何か不足していますか、それともロジックが本質的に遅いだけですか?

4

2 に答える 2

0

これは...グランド セントラル ディスパッチの仕事のようですね。

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 に答える