2011-03-15 4 views
0

를 얻을 여러 나는 HTML의 명령으로 파일을 읽을 수 이러한 정보 :는 NSXMLParser는 "BAD ACCESS"

Thread1: Program received signal: "EXC BAD ACCESS"

아이디어 :

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict 
{ 
    if(somethingfound) 
    { 
      [parseHTML abortParsing]; 
      parseHTML2 = [[NSXMLParser alloc] initWithContentsOfURL:[NSURL URLWithString:[@"http://theurl.com" stringByAppendingString:product_link]]]; 
      [parseHTML2 setDelegate:self]; 
      [parseHTML2 parse]; 
    } 
} 

내가 불규칙한 오류가? 관련


귀하의 코멘트에 대한

안녕하세요 월터 감사, 여기에 완벽하게 구현입니다 : 나는 그것이 ... 도움이되기를 바랍니다 : -/

FirstViewController.h

#import <UIKit/UIKit.h> 

@interface FirstViewController : UIViewController <ZBarReaderDelegate, NSXMLParserDelegate>{ 

    UIImageView *resultImage; 
    UITextView *resultText; 
    NSString *product_link; 
    NSXMLParser *parseHTML; 
    NSXMLParser *parseHTML2; 

} 
@property (nonatomic, retain) IBOutlet UIImageView *resultImage; 
@property (nonatomic, retain) IBOutlet UITextView *resultText; 
@property (nonatomic, assign) IBOutlet NSString *product_link; 
@property (nonatomic, assign) NSXMLParser *parseHTML; 
@property (nonatomic, assign) NSXMLParser *parseHTML2; 
@property (nonatomic, retain) NSMutableArray *myMutableArray; 

- (IBAction) scanButtonTapped; 

@end 

FirtViewController.m

#import "FirstViewController.h" 
#import "/System/Library/Frameworks/Foundation.framework/Headers/NSDebug.h" 

@implementation FirstViewController 


@synthesize resultImage, resultText; 
@synthesize product_link; 
@synthesize parseHTML, parseHTML2; 


bool link_is_here = false; 
bool allergy_is_here = false; 
bool parse_one_ok = true; 
int hoch = 0; 


- (IBAction) scanButtonTapped 
{ 
    NSZombieEnabled = true; 

    // ADD: present a barcode reader that scans from the camera feed 
    ZBarReaderViewController *reader = [ZBarReaderViewController new]; 
    reader.readerDelegate = self; 

    ZBarImageScanner *scanner = reader.scanner; 
    // TODO: (optional) additional reader configuration here 

    // EXAMPLE: disable rarely used I2/5 to improve performance 
    [scanner setSymbology: ZBAR_I25 
        config: ZBAR_CFG_ENABLE 
         to: 0]; 

    // present and release the controller 
    [self presentModalViewController: reader animated: YES]; 
    [reader release]; 
} 

- (void) imagePickerController: (UIImagePickerController*) reader 
didFinishPickingMediaWithInfo: (NSDictionary*) info 
{ 

    // ADD: get the decode results 
    id<NSFastEnumeration> results = [info objectForKey: ZBarReaderControllerResults]; 
    ZBarSymbol *symbol = nil; 
    for(symbol in results) 
     break; 

    // EXAMPLE: do something useful with the barcode data 
    resultText.text = symbol.data; 
    parseHTML = [[[NSXMLParser alloc] initWithContentsOfURL:[NSURL URLWithString:[@"http://URL.de/suche/?q=" stringByAppendingString:symbol.data]] ]autorelease]; 
    [parseHTML setDelegate:self]; 
    [parseHTML parse]; 

// [parseHTML release]; 

    // EXAMPLE: do something useful with the barcode image 
    resultImage.image = 
    [info objectForKey: UIImagePickerControllerOriginalImage]; 

    // ADD: dismiss the controller (NB dismiss from the *reader*!) 
    [reader dismissModalViewControllerAnimated: YES]; 
} 


- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict 
{ 
    for(NSString *key in [attributeDict allKeys]) { 
     if ([[attributeDict valueForKey:key] isEqualToString:@"some_string"]) { 
      link_is_here = true;   
     } 
     if ([key isEqualToString:@"href"] && link_is_here) { 
      product_link = [attributeDict valueForKey:key]; 

//   [parseHTML abortParsing]; 

      parseHTML2 = [[NSXMLParser alloc] initWithContentsOfURL:[NSURL URLWithString:[@"http://URL.de" stringByAppendingString:product_link]]]; 
      [parseHTML2 setDelegate:self]; 
      [parseHTML2 parse]; 
      parse_one_ok = true; 
      link_is_here = false; 
     } 
     if ([key isEqualToString:@"id"] && [[attributeDict valueForKey:key] isEqualToString:@"other_string"]) { 
      allergy_is_here = true; 
     } 
     if ([key isEqualToString:@"title"] && allergy_is_here) {  
      NSLog(@"DO: %@",[attributeDict valueForKey:key]); 
     } 
     if ([key isEqualToString:@"id"] && [[attributeDict valueForKey:key] isEqualToString:@"string"]) { 
      allergy_is_here = false; 

      parse_one_ok = true; 
      NSLog(@"Parser off"); 
      //close all parser 
     } 
    } 
} 
-(void) parserDidEndDocument:(NSXMLParser *)parser{ 
    [parseHTML setDelegate:nil]; 
    [parseHTML2 setDelegate:nil]; 
    [parseHTML release]; 
    if (parse_one_ok) { 

     [parseHTML2 release]; 
    } 
} 

- (void)didReceiveMemoryWarning { 
    // Releases the view if it doesn't have a superview. 
    [super didReceiveMemoryWarning]; 

    // Release any cached data, images, etc that aren't in use. 
} 

- (void)viewDidUnload { 
    // Release any retained subviews of the main view. 
    // e.g. self.myOutlet = nil; 
} 


- (void)dealloc { 
    [parseHTML release]; 
    [parseHTML2 release]; 
    self.product_link = nil; 
    self.resultImage = nil; 
    self.resultText = nil; 
    [super dealloc]; 
} 

@end 

안녕하세요. 내 신고서에 있습니다. 헤더 :

@interface FirstViewController : UIViewController <NSXMLParserDelegate>{ 
    NSString *product_link; 
    NSXMLParser *parseHTML; 
    NSXMLParser *parseHTML2; 
} 
@property (nonatomic, retain) IBOutlet NSString *product_link; 
@property (nonatomic, retain) NSXMLParser *parseHTML; 
@property (nonatomic, retain) NSXMLParser *parseHTML2; 

과 소스 :

@synthesize parseHTML, parseHTML2; 
@synthesize product_link; 

내가 콘솔에서 이러한 예외를 얻을 : 내가 두 번째를 설정 한 번에 두 개의 파일을 구문 분석 할 필요가

-[NSCFString setDelegate:]: unrecognized selector sent to instance 0x1acad0

+0

충돌에 대한 스택 추적 정보를 게시 할 수 있습니까? – fbrereto

+0

또한 게시 된 코드는 변수'parseHTML' 및'product_link'의 선언처럼 중요한 정보가 누락 된 것 같습니다. – fbrereto

+0

동시에 이것을해야합니까? 찾은 데이터를 NSArray에 저장하고 나중에 두 번째 파일을 파싱 할 수 있습니까? – FreeAsInBeer

답변

1

두 번째 파일에 대한 위임자. 위임자는 NSXML Parser Delegate 프로토콜을 준수하는 간단한 NSObject입니다. (parserDidStart, parserDidEnd을 가지고 있습니다.) 첫 파서의 didEndElement은 내가 당신이 거기에서 큐를 가지고 왜 별도의 스레드에서 그것을 할이

SoundCloudParser *scParser = [[[SoundCloudParser alloc] init]autorelease]; 
NSOperationQueue *queue = [[[NSOperationQueue alloc] init]autorelease]; 
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:scParser selector:@selector(parseXMLUrl:) object:currentArticle.uriString]; 
[queue addOperation:operation]; 
[operation release]; 

같은과 두 번째 파서 킥오프 내에서 다음

. 내 'parseXMLUrl : looks just like a regular one, it just sets the delegate to my second delegate object instead of setting it to 자체'.

당신이 생각해야 할 또 하나의 문제는 didStartElement에서 일을하고 있고, 내가 didEndElement에 도착할 때까지 필자의 파싱 변수에 값이없는 것을 많이 발견한다는 것입니다. 그건 당신이 확인해야 할 다른 것입니다.

업데이트 : ZBarSDK 또는 다른 프로젝트와 같은 것을 빌드하려는 경우 미래에 말하십시오. 그것은 당신의 코드를 어지럽히는 데 약 30 분을 절약 할 수있었습니다.
기본적으로해야 할 일은 새 대리인을 설정하는 것입니다. newDelegate이라고합시다. 일반 NSObject로 설정하고 <NSXMLDelegate> 프로토콜을 따르도록합니다. 구문 분석 할 데이터를 저장하기 위해 mutableArray 또는 사전이 필요하며이를 실행하기위한 함수가 필요합니다. 그리고 그것에 관한 것입니다.
프로젝트에 newDelegate.hnewDelegate.m을 생성했다고 가정하고 newDelegate.h에 #import "Your_App_Delegate"가 있다고 가정 해 보겠습니다.시간 " @interface의 newDelegate : NSObject의 {

NSMutableString *currentElement; 
NSMutableArray *currentArticle; 
} 

- (void)parseXMLUrl:(NSString *)URL; 
@end 

그래서, 지금에 didStartElement이 같은 newDelegate를 부를 것이다 :

newDelegate *ndParser = [[[newDelegateParser alloc] init]autorelease]; 
NSOperationQueue *queue = [[[NSOperationQueue alloc] init]autorelease]; 
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:ndParser selector:@selector(parseXMLUrl:) object:[NSString stringWithFormat:@"http://URL.de/%@",product_link]]; 
[queue addOperation:operation]; 
[operation release];  

이 두 번째 파서을 걷어차 고에에게 URL을 전달할 것 해당 데이터를 가져 오는 방법이 필요하므로 App Delegate에 결과를 저장하거나 두 번째 파서의 parseXMLURL 메서드를 변경하여 일부 값을 반환해야합니다.

+0

와우, 나에게 굉장히 많은 정보입니다. 멍청한 놈 ... 제 codeexample에 대해 설명해 주시겠습니까? 그게 좋을거야 !! 안부 – Phil

+0

귀하의 애플 리케이션은 단지 비어있는 App Delegate이고 FirstViewController.m과 FirstViewController.h라고 가정하면 두 개의 FirstViewController 파일의 전체 내용을 게시하지 않는 것이 좋습니다. 나는 당신을 돕기 위해 계속할 충분한 정보가 없습니다. 현재 코드가있는 간단한 프로젝트를 만들 때 오류가 발생하지 않고 원하는대로 처리합니다 (첫 번째 파서가 멈추고 두 번째 파서가 시작됩니다). – Walter

+0

여기 내 코드 ... – Phil