我有一个显示项目的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);
答案 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实例。
ProductData *dicItem = [[ProductData alloc]init];
这永远不会被使用,并在下面2点被立即丢弃。dicItem = [[ProductData alloc]initWithDictionary:jsonItem];
restaurantDataInstance = [[ProductData alloc] init];
- 这是关注单身对象。 dicItem.itemArray = pElements;
- pElements是ProductData
个对象的数组。您是否打算拥有ProductData
类型的对象,其中包含ProductData
个对象的数组?
答案 2 :(得分:0)
在单件类中定义属性,如
@property (non atomic, strong) NSMutlabeArray* itemArray;
然后在appDelegate
中分配init这个数组applicationDidFinishLanchingWithOptions