JSON序列化后,类数组对象值始终返回nil

我创建了一个名为“ GetDataFromURL”的函数,该函数是获取数据形式URL并将其存储到本地Class Array对象中的主要任务。 使用URlSession.shared.dataTask函数,我将数据接收为DATA格式,然后通过使用jsonserialization.jsonObject方法获得json格式。响应采用字典格式,因此存储到临时类对象中,最后它将追加到全局类数组对象中。当Page称为“查看加载”方法时,将调用此函数。在函数内,它将显示所有数据,但是每次当我在块外显示时,当我得到nil数组对象时。

public class Modelclass : NSObject {

var id :Int!
var albumId : Int!
var title : String!
var url : String!
var thumbnailUrl : string! 

}

这是Class文件,下面是viewcontroller文件:

var temp:[ModelClass]? 

override func viewDidLoad() {

super.viewDidLoad()
self.temp = [ModelClass]()
dispatchQueue.main.async{
    self.GetDataFromURL()
}

print(self.temp,"Tesing print")
}



  func GetDatafromURL() {

  if let url = URL(string : 
  "https://jsonplaceholder.typicode.com/photos"){
   URLSession.shared.dataTask(with: url){(data,response,error) in
    if error != nil {
        print(error)
        return
    }
    do{
        let jsonresponse = try jsonserialization.jsonObject(with:data!,options: .mutablecontainers)
        for dictionary in jsonresponse as! [[String:AnyObject]]
        {
            var test = ModelClass()
            test.title = dictionary["title"] as? String
            test.albumId = dictionary["albumId"] as? Int
            test.id = dictionary["id"] as? Int
            test.thumbnailUrl = dictionary["thumbnailUrl"] as? String
            test.url = dictionary["url"] as? String
            self.temp?.append(test)
        }

    }
    catch let jsonerror{
        print(jsonerror)
    }
 }.resume()
}
}

它向我显示“ optional([])Tesing print”作为输出。在do块内打印该临时对象时,它将显示所有数据。

guotenglin534577320 回答:JSON序列化后,类数组对象值始终返回nil

//添加此     var dispatchgroup = DispatchGroup()     //

var temp: [Modelclass] = []

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.


    self.GetDatafromURL()

    //Add this
    dispatchgroup.notify(queue: .main){
         print("temp data : \(self.temp.count)")
    }

}



  func GetDatafromURL() {

    //add this
    dispatchgroup.enter()
    //

  if let url = URL(string :
  "https://jsonplaceholder.typicode.com/photos"){
   URLSession.shared.dataTask(with: url){(data,response,error) in
    if error != nil {
        print(error)
        return
    }
    do{


        let jsonresponse = try JSONSerialization.jsonObject(with: data!,options: .mutableContainers)

        for dictionary in jsonresponse as! [[String:AnyObject]]
        {
            var test = Modelclass()
            test.title = dictionary["title"] as? String
            test.albumId = dictionary["albumId"] as? Int
            test.id = dictionary["id"] as? Int
            test.thumbnailUrl = dictionary["thumbnailUrl"] as? String
            test.url = dictionary["url"] as? String
            self.temp.append(test)
        }

          //add this
        self.dispatchgroup.leave()
        //


    }
    catch let jsonerror{
        print(jsonerror)
    }
 }.resume()
}

}

,

这是目标c的版本,

   @property (strong,nonatomic) NSMutableArray<UserModel *> *jsonarray ;
   @end

   @implementation ViewController

   dispatch_group_t serviceGroup;
   NSMutableDictionary *result ;


  - (void)viewDidLoad {
   [super viewDidLoad];
   // Do any additional setup after loading the view,typically from a nib.

    result = [[NSMutableDictionary alloc]init];
    self.tableView.delegate = self;
    self.tableView.dataSource = self;

     UINib *nib = [UINib nibWithNibName:@"TableViewCell" bundle:nil];
    [self.tableView registerNib:nib forCellReuseIdentifier:@"TableViewCell"];
    serviceGroup = dispatch_group_create();


    _jsonarray = [[NSMutableArray alloc]init];

// \ [userdata GetDatafromUrl:@“ https://jsonplaceholder.typicode.com/users”];

    [self GEtDataFromurl:@"https://jsonplaceholder.typicode.com/users"];
    }



 -(void)GEtDataFromurl:(NSString *) urlstr{

 dispatch_group_enter(serviceGroup);
[[NSURLSession.sharedSession dataTaskWithURL:[NSURL URLWithString:urlstr] completionHandler:^(NSData *_Nullable data,NSURLResponse *_Nullable response,NSError *_error){
    NSError *err;
    NSArray *json = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&err];
    if(err){
        NSLog(@"Falied to serialization.. ");
        return;
    }

    for (NSDictionary *UserDir in json){
        NSString *Id = UserDir[@"id"] ;
        NSString *name = UserDir[@"name"] ;
        NSString *username = UserDir[@"username"];
        NSString *email = UserDir[@"email"];
        NSString *phone = UserDir[@"phone"];
        NSString *website = UserDir[@"website"];

        struct company *company = CFBridgingRetain(UserDir[@"company"]);
        struct address *address = CFBridgingRetain(UserDir[@"address"]);

        UserModel *model = UserModel.new;
        model.Id =  [Id intValue];
        model.name = name;
        model.address = address;
        model.username = username;
        model.email  = email;
        model.phone = phone;
        model.website = website;
        model.company = company;
        NSLog(@"%@",model.name);
        [_jsonarray addObject:model];

    }
            dispatch_group_leave(serviceGroup);
}]resume];

dispatch_group_notify(serviceGroup,dispatch_get_main_queue(),^{


    NSLog(@" outside user class :  %@",_jsonarray);

    [self.tableView reloadData];
});

}

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {     返回1; }

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

TableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"TableViewCell" forIndexPath:indexPath];
if(cell == nil){
    NSArray *obj = [[NSBundle mainBundle] loadNibNamed:@"TableViewCell" owner:self options:nil];
    cell = [obj objectAtIndex:0];
}
UserModel *model = _jsonarray[indexPath.row];
cell.displaylabel.text = model.username;

return  cell;

}

- (NSInteger)tableView:(nonnull UITableView *)tableView numberOfRowsInSection:                (NSInteger)section {
 return _jsonarray.count;

}

@end

本文链接:https://www.f2er.com/3166205.html

大家都在问