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