gpt4 book ai didi

objective-c - 枚举对象与选项 :usingBlock: causing frequent unexplained freezes

转载 作者:行者123 更新时间:2023-12-03 16:51:30 27 4
gpt4 key购买 nike

我尝试使用 enumerateObjectsWithOptions:usingBlock 方法枚举数组。然而,我的代码很少能工作。当它不起作用时,我的应用程序会卡住(但没有沙滩球)——我对 block 相对较新,所以我一定缺少 block 操作顺利工作所需的东西。

注意:我知道我可以使用 for 循环进行枚举,但这不是我想要的。

麻烦的代码:

   NSArray*_storageCookies = [[NSArray alloc] initWithArray:[storage cookies]];

NSArray*_historyObjects = [[NSArray alloc] initWithArray:[_history webkitHistory]];

NSOperationQueue*_queue = [[NSOperationQueue alloc] init];

NSBlockOperation*_block = [NSBlockOperation blockOperationWithBlock:^{

NSAutoreleasePool*_pool = [[NSAutoreleasePool alloc] init];

[_storageCookies enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(id ck, NSUInteger index, BOOL *stop)
{
NSString*domain = [ck domain];

[_historyObjects enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(id object, NSUInteger aindex, BOOL *stop)
{
@synchronized(self)
{
NSAutoreleasePool*_pool2 = [[NSAutoreleasePool alloc] init];

NSString*_historyURL = [[NSURL URLWithString:[object url]] host];

if ([_historyURL rangeOfString:domain].location != NSNotFound)
{
NSHTTPCookie*cookie = [DAHTTPCookie createCookieWithURL:[ck domain] cookieName:[ck name] expires:[[ck expiresDate] timeIntervalSince1970] cookieValue:[ck value] browserType:DAWebkitBrowser secure:[ck isSecure]];

if ([_cookies containsObject:cookie] == NO)
{
[_cookies addObject:cookie];
}
}

[_pool2 release];
}
}];
}];

[_pool release];
}];

[_queue addOperations:[NSArray arrayWithObject:_block] waitUntilFinished:YES];

NSLog(@"Done - found %i Cookies...",[_cookies count]); //sometimes returns 0, sometimes the right number or nothing

编辑

我已经修好了。你是对的,我的类(class)不是线程安全的。因此,我必须添加一个 @synchronized block 才能使其按预期工作。

最佳答案

当您说“我正在使用 for 循环并且它有效”时,您的意思是您的 for 循环是同时运行的还是它们实际上是线性运行的?

看看这段代码, block 的使用没有任何问题。虽然在不完全了解您正在使用的 API 的情况下不可能得出结论,但该代码中的底层算法实际上是爆炸性并行

也就是说,每个循环都配置为尽可能同时尝试并处理内容。除非您调用的 API 的每个部分都是线程安全的,否则您的代码可能会由于多线程冲突而崩溃和/或锁定(症状的随机性是并发问题的明确标志)。

即使所有 API 都是线程安全的,爆炸性并发也几乎不是正确的并发模型。充其量,您需要限制并发性;您想使用某种机制来限制同时处理的垃圾数量。

关于objective-c - 枚举对象与选项 :usingBlock: causing frequent unexplained freezes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8630248/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com