NSMutableArray显示为空,但正在填充

时间:2013-05-20 11:03:18

标签: ios nsmutablearray

我遇到NSMutableArray的一个主要问题,我可能错过了一些非常明显的东西 - 可能一直在看它,以至于我看不到它。

我正在阅读一些推文,然后使用结果来填充NSMutableArray:

@synthesize testArray;

- (void)viewDidLoad{

        [super viewDidLoad];

        testArray = [[NSMutableArray alloc] init];

        TWRequest *request = [[TWRequest alloc] initWithURL:[NSURL URLWithString:@"http://search.twitter.com/search.jsonq=kennedy&with_twitter_user_id=true&result_type=recent"]
        parameters:nil requestMethod:TWRequestMethodGET];

       [request performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error)
       {
        if ([urlResponse statusCode] == 200) {

            // The response from Twitter is in JSON format
            // Move the response into a dictionary
            NSError *error;
            NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:responseData options:0 error:&error];
            NSArray *results = [dict objectForKey:@"results"];

            //Loop through the results
            for (NSDictionary *tweet in results) {

                tweetStore *tweetDetails = [[tweetStore alloc] init];
                NSString *twitText = [tweet objectForKey:@"text"];

                //Save the tweet to the twitterText array
                tweetDetails.name = @"test";
                tweetDetails.date = @"test";
                tweetDetails.tweet = twitText;

                [testArray addObject:tweetDetails];
            }

            tweetStore *retrieveTweet = (tweetStore*)[testArray objectAtIndex:0];
            NSLog(@"tweet is: %@", retrieveTweet.tweet);
            //NSLog(@"Array is: %@", testArray); - *can* view Array etc here
        }

         else {
               NSLog(@"Twitter error, HTTP response: %i", [urlResponse statusCode]);
         }
    }
     ];


    NSLog(@"test array: %@", testArray); //Array is now empty......
}

我可以在我标记它的代码中查看数组,检索我想要的对象等,它完美地工作。但是一旦我尝试访问或显示除此之外的数组中的任何内容,那么它似乎是空的。任何帮助或指示将不胜感激。

1 个答案:

答案 0 :(得分:0)

问题是块中的代码是以异步方式执行的,因此在 NSLog代码之后执行

执行的代码遵循以下流程:

  • 首先执行初始化:

    [super viewDidLoad];
    
    testArray = [[NSMutableArray alloc] init];
    
    TWRequest *request = [[TWRequest alloc] initWithURL:[NSURL URLWithString:@"http://search.twitter.com/search.jsonq=kennedy&with_twitter_user_id=true&result_type=recent"]
    parameters:nil requestMethod:TWRequestMethodGET];
    
  • 您启动请求:

    [request performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) { <block_code> } ];
    
  • 您打印的数组信息是空的(正确):

    NSLog(@"test array: %@", testArray);
    

现在异步请求结束并且块中的代码被执行:因此只在块代码中正确填充数组。