1

XMLファイルを解析しTBXMLて値を多次元に入れようとしていますNSMutableArray が、問題は値が配列に追加されないことです。値を出力すると、 と が返さnullれます0

これは私のコードです:

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self downloadAndParseXml:@"http://www.w3schools.com/XML/note.xml"];

    // RETURNS 0
    NSLog(@"weatherArray count: %d", [weatherArray count]);

    // RETURNS NULL
    NSLog(@"weatherArray value: %@", weatherArray[0][0]);
}

- (void)downloadAndParseXml:(NSString *)xmlUrl
{
    // Allocating the array
    weatherArray = [NSMutableArray array];

    TBXMLSuccessBlock sBlock = ^(TBXML *tbxmlDocument) {
        if (tbxmlDocument.rootXMLElement)
            [self fillArrayWithXmlContents:tbxmlDocument.rootXMLElement];
    };

    TBXMLFailureBlock fBlock = ^(TBXML *tbxmlDocument, NSError *error) {
        NSLog(@"Failureblock: %@\n%@", [error localizedDescription], [error userInfo]);
    };

    [TBXML newTBXMLWithURL:[NSURL URLWithString:xmlUrl] success:sBlock failure:fBlock];
}

- (void)fillArrayWithXmlContents:(TBXMLElement *)element {
    do {
        if (element->firstChild)
            [self fillArrayWithXmlContents:element->firstChild];

        if ([[TBXML elementName:element] isEqualToString:@"note"]) {

            // Adding values into the multidimensional array
            [weatherArray addObject:[NSArray arrayWithObjects:
                [TBXML textForElement:[TBXML childElementNamed:@"to" parentElement:element]],
                [TBXML textForElement:[TBXML childElementNamed:@"from" parentElement:element]],
                [TBXML textForElement:[TBXML childElementNamed:@"heading" parentElement:element]],
                [TBXML textForElement:[TBXML childElementNamed:@"body" parentElement:element]], NULL]];

            // Correct value is getting logged
            NSLog(@"weatherArray value: %@", weatherArray[0][0]);
        }
    } while ((element = element->nextSibling));
}
4

1 に答える 1

1

おそらくあなたがする必要があるのは、プロセスが完了するのを待つことであり、ブロックは文字通りあなたがその中で何をしているのかわからないか、内部関数がブロックによってキャプチャされていないと言うでしょう。あなたの配列を使用している)ブロックが完了した後にのみ。

例:

TBXMLSuccessBlock s = ^(TBXML *tbxml) {
    NSLog(@"yes");
    // Do something with TBXML object "tbxml/add it ur array
   //Here you call the function which is about to use your array.

};

//Not outside the block.

編集:これを参照してください==> APIを実装するときにブロックで自己をキャプチャしないようにするにはどうすればよいですか?

于 2013-08-29T07:52:11.340 に答える