I have a question that I have been researching but can't find an answer for.

I have some iOS 3.2 code using NSOperation this doesn't work using NSOperation 
but works using NSThread withe detatch thread in iOS4 with the desired effect. 
My code is basically to create and generate pages for my paged scrollview in 
the background. Its basically a play on the WWDC picture scroller demo. I 
however have some almost full screen views we prepare in the background. The 
code look like:

-(void) tilePages {
        
        @synchronized(self)
        {
        NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
        
        CGRect visibleBounds = infoCardScroller.bounds;
        NSInteger firstNeededIndex = 
floorf(CGRectGetMinX(visibleBounds)/CGRectGetWidth(visibleBounds));
        NSInteger lastNeededIndex = 
floorf((CGRectGetMaxX(visibleBounds)-1)/CGRectGetWidth(visibleBounds));
        
                currentIndex = firstNeededIndex;
        firstNeededIndex = MAX(firstNeededIndex-1, 0);
        lastNeededIndex = MIN(lastNeededIndex+1, [songs count] - 1);
        
        // recycle no longer visible pages
        for (HVInfoCardContainer* infoCard in visibleViews) {
                if (infoCard.index < firstNeededIndex || infoCard.index > 
lastNeededIndex) {
                        [recycledViews addObject:infoCard];
                        [infoCard removeFromSuperview];
                }
        }
        
        [visibleViews minusSet:recycledViews];
        
        // add missing pages.
        for (int index = firstNeededIndex; index <= lastNeededIndex; index++) {
                if (![self isDisplayingContainerForIndex:index]) {
                        HVInfoCardContainer* container = [self 
dequeueRecycledContainer];
                        
                        if (container == nil)
                                container = [[[HVInfoCardContainer alloc] init] 
autorelease];
                        
                        [self configureContainer:container forIndex:index];
                        [infoCardScroller addSubview:container];
                        [visibleViews addObject:container];
                                
                }
        }
        
        [pool release];
        }
;
}



I cached 3 views at most. I basically have the following when the view scrolls:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView; 
{
        [[NVGlobalQueue sharedNVGlobalQueue] cancelAllOperations];
        [[NVGlobalQueue sharedNVGlobalQueue] 
addOperation:[[[HVInfoCardTileOperation alloc] initWithScroller:self] 
autorelease]];
}

My operations's main is:

-(void) main {
        if (!self.isCancelled) {
                [self setQueuePriority:NSOperationQueuePriorityVeryHigh];
                [scrollerController tilePages];
        }
}
}       }
On iOS 3.2 i get what i expect. The third view is created and rendered as we 
scroll to the 2nd one. So i have 3 views in the my scroller full rendered as I 
scroll to the 2nd one. However, on iOS4 this isn't working I don't get my 3rd 
one for a few seconds after its scrolled too. However if i change to:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
        [NSThread detachNewThreadSelector:@selector(tilePages) toTarget:self 
withObject:nil];
}

This works great and scrolls as smooth as butter. I don't mind doing this since 
there is a check to see if we have to actually create the view (could probably 
make the tileView call even smarter). But why would this not work over 
NSOperation on iOS4 but work in 3.2? Going to the main thread isn't an options 
as it chunks the scroll And no removing the cancelAllOperations doesn't help.

Scott Andrew_______________________________________________

Cocoa-dev mailing list ([email protected])

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to [email protected]

Reply via email to