我是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
,它将显示结果。但是如果我在}];
之后(在代码结束之后)使用它,
它给了我空阵。
答案 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已经执行了。