0

我又回来了,这将是我今天的第二个问题。

无论如何,我正在使用NSJSONSerialization从我的网站解析数据。数据是数组格式,所以我使用NSMutableArray. 问题是,我无法访问存储在NSMutableArray不同视图控制器中的数据。

第一视图.h

#import <UIKit/UIKit.h>

@interface FirstViewController : UIViewController

@property (nonatomic, strong) NSMutableArray *firstViewControllerArray;

@end

第一视图.m

- (void)ViewDidLoad
{
    [super viewDidLoad];

    NSURL *url = [NSURL URLWithString:@"http://j4hm.t15.org/ios/jsonnews.php"];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    NSOperationQueue *queue = [[NSOperationQueue alloc]init];

    [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
            self.firstViewControllerArray = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
    }];

    [self loadArray];
}

- (void)loadArray
{
    NSMutableArray *array = [NSMutableArray arrayWithArray:[self firstViewControllerArray]];

    //I also tried codes below, but it still won't work.
    //[[NSMutableArray alloc] initWithArray:[self firstViewControllerArray]];
    //[NSMutableArray arrayWithArray:[self.firstViewControllerArray mutableCopy]];

    NSLog(@"First: %@",array);

    SecondViewController *secondViewController = [[SecondViewController alloc] init];
    [secondViewController setSecondViewControllerArray:array];
    [[self navigationController] pushViewController:secondViewController animated:YES];
}

第二个.h

#import <UIKit/UIKit.h>

@interface SecondViewController : UIViewController

@property (nonatomic, strong) NSMutableArray *secondViewControllerArray;

@end

秒.m

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSLog(@"Second: %@", [self secondViewControllerArray]);
}

输出

NSLog(@"First: %@",array);输出数组,因此它不会向 SecondViewController 传递(null)数组的值。

但是,NSLog(@"Second: %@", [self secondViewControllerArray]);将输出(null). 我错过了什么吗?

4

1 回答 1

2

在您将新视图控制器推送到堆栈上之前,我不相信您的下载已完成,并且还设置了该视图控制器的数组属性。现在,您在告诉 NSURLConnection 异步下载数据后立即调用 -loadArray。此下载将在您尝试访问数组属性很久之后完成。

尝试将调用移动到异步完成块中的 -loadArray(如下所示)。由于下载完成时会调用此块,因此您应该在推送第二个视图控制器时获得数据。

[NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
        self.firstViewControllerArray = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];

        dispatch_async(dispatch_get_main_queue(), ^{

            [self loadArray];

        });
}];
于 2013-02-02T18:30:47.323 回答