数组在Singleton中变为零

时间:2017-04-28 17:35:09

标签: ios objective-c

我有一个显示项目的ViewController。我获取数据并将其分配给我的模型类ProductData属性itemArray,如下所示。

ViewController.m

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
[manager GET:PRODUCT_ALL_URL parameters:nil progress: nil success:^(NSURLSessionTask * _Nonnull operation, id responseObject) {
    if(responseObject != NULL) {
        ProductData *dicItem = [[ProductData alloc]init];
        for ( id jsonItem in responseObject)
        {
            dicItem = [[ProductData alloc]initWithDictionary:jsonItem];
            [self.pElements addObject:dicItem];
        }

        // I can debug and see the itemArray is getting assigned
        dicItem.itemArray = pElements;
        [self categorySelection];
        [self.productCollectionView reloadData];
    }

} failure:^(NSURLSessionTask * _Nullable operation, NSError * _Nonnull error) 

}];

ProductData.m

+(ProductData*) restaurantDataInstance {
    static ProductData *restaurantDataInstance;
    @synchronized(self) {
        if(!restaurantDataInstance){
            restaurantDataInstance = [[ProductData alloc] init];
        }
    }
    return restaurantDataInstance;
}

- (id)init
{
 if (self = [super init]) {
    if (!itemArray || !itemArray.count){
        itemArray = [NSMutableArray arrayWithCapacity:10];
    }
  }
  return self;
}

我稍后尝试访问itemArray,但itemArray为零。即使我在ViewController中分配它。我不知道我错过了什么。

GlobalFunctions.m

ProductData *restaurantData = [ProductData restaurantDataInstance];
// the following returns a nil;
NSLog(@"%@",restaurantData.itemArray);

3 个答案:

答案 0 :(得分:1)

如果您打算在GET方法中将itemArray设置为单身,则需要将dicItem实际设置为单身:

if(responseObject != NULL) {
    for ( id jsonItem in responseObject)
    {
        ProductData *dicItem = [[ProductData alloc]initWithDictionary:jsonItem];
        [self.pElements addObject:dicItem];
    }

    // I can debug and see the itemArray is getting assigned
    [ProductData restaurantDataInstance].itemArray = pElements;//HERE!
    [self categorySelection];
    [self.productCollectionView reloadData];
}

如果您只是致电ProductData *dicItem = [[ProductData alloc]init];,那么您每次都会创建一个新实例。

应该这样做。

答案 1 :(得分:1)

您的代码存在许多问题。 ProductData应该是a)关于单个产品的单个记录,还是b)所有产品的数据库?你似乎试图将它用作两者。

如果a)它不应该是单身类。 如果b)你永远不应该手动分配/初始化单身。

您似乎正在初始化三个完全独立的ProductData实例。

  1. ProductData *dicItem = [[ProductData alloc]init];这永远不会被使用,并在下面2点被立即丢弃。
  2. dicItem = [[ProductData alloc]initWithDictionary:jsonItem];
  3. restaurantDataInstance = [[ProductData alloc] init]; - 这是关注单身对象。
  4. dicItem.itemArray = pElements; - pElements是ProductData个对象的数组。您是否打算拥有ProductData类型的对象,其中包含ProductData个对象的数组?

答案 2 :(得分:0)

在单件类中定义属性,如

@property (non atomic, strong) NSMutlabeArray* itemArray;

然后在appDelegate

中分配init这个数组
applicationDidFinishLanchingWithOptions