我遇到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......
}
我可以在我标记它的代码中查看数组,检索我想要的对象等,它完美地工作。但是一旦我尝试访问或显示除此之外的数组中的任何内容,那么它似乎是空的。任何帮助或指示将不胜感激。
答案 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);
现在异步请求结束并且块中的代码被执行:因此只在块代码中正确填充数组。