enumerateObjectsWithOptions:usingBlock
메서드를 사용하여 배열을 열거하려고합니다. 그러나 내 코드는 거의 작동하지 않습니다. 작동하지 않으면 내 앱이 멈 춥니 다 (해변 공이 없음). 저는 블록에 비교적 익숙하지 않으므로 블록 작업이 원활하게 작동하는 데 필요한 것을 놓치고 있어야합니다.enumerateObjectsWithOptions : usingBlock : 설명되지 않는 현상이 자주 발생합니다.
참고 :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
편집
나는 그것을 해결했습니다. 당신 말이 옳았습니다. 제 수업은 스레드로부터 안전하지 못했습니다. 그래서 예상대로 작동하려면 @synchronized
블록을 추가해야했습니다.
잠재적으로 폭발적인 동시성 알고리즘을 사용하고 있습니다. 지금은 효과가 있지만 너무 비효율적 일 수 있습니다. – bbum
알았어 - 내가 어떻게 막을거야? 나는 열거의이 종류에 새롭다, 그래서 나는 너를 줄 수있는 어떤 통찰력을 주셔서 감사합니다! – Pripyat