从json对象外部使用NSArray对象

时间:2015-09-02 07:27:07

标签: ios objective-c json

我是Objective-C的新手,只是想知道如何在JSON之外使用NSArray对象。

例如:

NSURL *url = [NSURL URLWithString:@"http://acumen-locdef.elasticbeanstalk.com/service/countries"];


NSURLRequest *request = [NSURLRequest requestWithURL:url];

NSMutableArray *myFinalListArray = [[NSMutableArray alloc] init];

[NSURLConnection sendAsynchronousRequest:request
                                   queue:[NSOperationQueue mainQueue]
                       completionHandler:^(NSURLResponse *response,
                                           NSData *data, NSError *connectionError)
 {
     if (data.length > 0 && connectionError == nil)
     {
         NSMutableArray *greeting = [NSJSONSerialization JSONObjectWithData:data
                                                             options:0
                                                               error:NULL];


         for (NSDictionary *countryList in greeting) {

             [myFinalListArray addObject:countryList[@"name"]];

         }

     }

     NSLog(@"%@",myFinalListArray); //(This one showing all results..)

 }];

 NSLog(@"%@",myFinalListArray); //(This one giving empty result)

我定义了myFinalListArray并在for循环中添加了对象。

如果在循环内或循环外使用NSLog,它将显示结果。但是如果我在}];之后(在代码结束之后)使用它, 它给了我空阵。

6 个答案:

答案 0 :(得分:0)

在网络提取完成之前,不执行与sendAsynchronousRequest关联的代码块;这需要一些时间。当网络提取正在进行时,您的代码将继续执行,从sendAsynchronousRequest之后的行NSLog(@"%@",myFinalListArray);开始 - 但由于网络操作尚未完成,您将获得一个空数组。

在块中,您需要包含处理数组所需的代码,更新用户界面或其他任何内容(如果更新UI,请确保在主线程上调度操作)

答案 1 :(得分:0)

这会奏效。你可以试试这个。

cudNN

答案 2 :(得分:0)

如果您在tableview中访问myFinalListArray,那么您可以在获取数据后在块内重新加载tableview。

或者如果您在其他任务中访问此数组,则必须发出通知调用(have to add observer),然后发布通知,该通知将调用其他方法并访问您的阵列并执行更多操作。< / p>

答案 3 :(得分:0)

-(void)sendRequest
{    
    NSURL *url = [NSURL URLWithString:@"http://acumen-locdef.elasticbeanstalk.com/service/countries"];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    NSMutableArray *myFinalListArray = [[NSMutableArray alloc] init];
    [NSURLConnection sendAsynchronousRequest:request
                               queue:[NSOperationQueue mainQueue]
                   completionHandler:^(NSURLResponse *response,
                                       NSData *data, NSError *connectionError) {
     if (data.length > 0 && connectionError == nil)
     {
         NSMutableArray *greeting = [NSJSONSerialization JSONObjectWithData:data
                                                         options:0
                                                           error:NULL];

        if( !myFinalListArray )
        {
            myFinalListArray=[[NSMutableArray alloc]init];
        }
         for (NSDictionary *countryList in greeting) {

             [myFinalListArray addObject:countryList[@"name"]];

         }

     }

     [self printArray];

    }];
}

//create method that will execute after response
-(void) printArray
{
    NSLog(@"%@",myFinalListArray); //(This one showing all results..)
}

答案 4 :(得分:0)

使用
__block NSMutableArray * myFinalListArray = [[NSMutableArray alloc] init];

这应该有用。

快乐编码。

答案 5 :(得分:0)

sendAsynchronousRequest异步运行,这意味着下面的代码已在请求仍在运行时执行,因此NSLog正在记录空数组。 只有在请求完成时,数组才会被填满,但您的外部NSLog已经执行了。