作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我尝试使用 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/
我是一名优秀的程序员,十分优秀!