I did a solution like this

-(NSDictionary *)pListWithWebElements{
        if(_exporter == nil){
                _exporter = [[XWSC2WExporter alloc] init];
        }
        
        NSString * htmlString  = [_exporter 
generateExportedHTMLFromLayouts:_layoutsArray];
        if(_webController == nil){
                _webController = [[XWSPreviewWebController alloc] 
initWithWindowNibName:@"XWSPreviewWeb"];
                [_webController set_parentController:self];
        }       
        [_webController showWindow:self];
        [_webController set_htmlString:htmlString];
        flagLoad = NO;
        
        while ( !flagLoad && [[ NSRunLoop currentRunLoop ] 
runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]){
                NSLog(@"WAITING");
        }
        
        return pListWithWebElements;
}

#pragma mark LoadFrameDelegate.
-(void)webView:(WebView *)sender didFinishLoadForFrame:(WebFrame *)frame{
        WebArchive * wa = [[frame dataSource] webArchive];
        NSData * data = [wa data];
        // uses toll-free bridging for data into CFDataRef and CFPropertyList 
into NSDictionary
        CFPropertyListRef plist =  
CFPropertyListCreateFromXMLData(kCFAllocatorDefault, (CFDataRef)data,
                                                                                
                                           
kCFPropertyListMutableContainersAndLeaves,
                                                                                
                                           NULL);
        // we check if it is the correct type and only return it if it is
        if ([(id)plist isKindOfClass:[NSDictionary class]])
        {
                [self setPListWithWebElements:[(NSDictionary *)plist 
autorelease]];
        }
        else
        {
                // clean up ref
                CFRelease(plist);
        }
        
        flagLoad = YES;
}


I duno if its the best solution but it works.. Im open to hear other 
approaches...

thanks 
Gustavo


On Jan 26, 2010, at 12:56 PM, Gustavo Pizano wrote:

> Hello all.
> I have this situation:
> I have a WebView which mainFrame Im loading form a NSString,  then Im 
> implementing the delegate :
> 
> -(void)webView:(WebView *)sender didFinishLoadForFrame:(WebFrame *)frame;
> 
> to check when the frame finish loading I can generate a pList to return to 
> the caller. BUT this method its called only when the frame did load, as it 
> says., and Im returning the dicitonary before this method its even called.
> 
> this is what I have
> 
> -(NSDictionary *)pListWithWebElements{
>       if(_exporter == nil){
>               _exporter = [[XWSC2WExporter alloc] init];
>       }
>       
>       NSString * htmlString  = [_exporter 
> generateExportedHTMLFromLayouts:_layoutsArray];
>       if(_webController == nil){
>               _webController = [[XWSPreviewWebController alloc] 
> initWithWindowNibName:@"XWSPreviewWeb"];
>               [_webController set_parentController:self];
>       }       
>       [_webController showWindow:self];
>       [_webController set_htmlString:htmlString];
>       
>       return pListWithWebElements;
> }
> 
> #pragma mark LoadFrameDelegate.
> -(void)webView:(WebView *)sender didFinishLoadForFrame:(WebFrame *)frame{
>       WebArchive * wa = [[frame dataSource] webArchive];
>       NSData * data = [wa data];
>       // uses toll-free bridging for data into CFDataRef and CFPropertyList 
> into NSDictionary
>       CFPropertyListRef plist =  
> CFPropertyListCreateFromXMLData(kCFAllocatorDefault, (CFDataRef)data,
>                                                                               
>                                            
> kCFPropertyListMutableContainersAndLeaves,
>                                                                               
>                                            NULL);
>       // we check if it is the correct type and only return it if it is
>       if ([(id)plist isKindOfClass:[NSDictionary class]])
>       {
>               [self setPListWithWebElements:[(NSDictionary *)plist 
> autorelease]];
>       }
>       else
>       {
>               // clean up ref
>               CFRelease(plist);
>       }
>       
> }
> 
> so form the first methohd when I reach the return statement, the ivar its nil 
> because it hasn't been initialized by the webframeload delegate.
> 
> What do I need to do to return the ivar initialized? this is my first time 
> encounter with a multithreading problem, Im totaly new to this topic, but I 
> undertand that I must somehow wait for one thread to finish to be able to 
> return the data on the main thread... am I wrong?
> 
> Also I dunno if this shall be here or in WebKit so please if you feel it 
> shouldn't be here let me know and I post it in the webKit dev List
> 
> Thanks a lot
> 
> Regards
> 
> Gustavo Pizano
> 

_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

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 arch...@mail-archive.com

Reply via email to