我想我缺少有关Objective-C编程的一些基本知识。
调用堆栈如下:
MyViewController调用一个块以建立对我的服务器的请求。
[_myClient storePhoto:photo withCompletion: ^(KNPhotoInfo *retPhoto, NSError *error) { // do stuff }];
该调用向我的服务器提出了一个保存照片的请求,然后尝试处理响应:
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
if(error) //handle it
@try
{
NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
KNPhotoInfo *photoInfo = [[KNPhotoInfo alloc] initWithPhotoDictionary:json[@"data"]];
[_storage setObject:[photoInfo toDictionary] forKey:PhotoInfoKey];
completionHandler(photoInfo, nil);
}
@catch (NSException *exception)
{
NSLog(@"Error parsing user info: %@", exception);
}
}];
但是,如果我在调用photoInfo变量的init函数之前对其进行检查,则可以在其中看到一些数据(不仅仅是垃圾)。如果我进入init函数,则在分配了某些内容后,我可以看到自己的对象闪烁,但是它再次显示“ 0个对象”。初始化函数的调用返回后,一切似乎都很好,我可以看到具有json [“ data”]初始化的所有属性的对象,但是一旦我再次执行photoInfo再次说“ 0 objects”。
有人可以帮我从这里出去吗?我认为这与调用类的“自身”与对象初始化的位置的自身有关,但我感到困惑。 :s
编辑:添加更多的上下文。初始化函数如下所示:
- (instancetype) initWithPhotoDictionary:(NSDictionary *)dict{
self = [super init];
self.url = dict[@"photo"][@"url"];
self.challenge = dict[@"photo"][@"challenge"];
self.user = dict[@"photo"][@"user"];
self.pubDate = dict[@"photo"][@"pub_date"];
return self;
}
但是,在此调用中进行调试时,self没有子级(即使它显然具有子级),并且只说“ 0个对象”。令人沮丧的是,当
[_storage setObject:[photoInfo toDictionary] forKey:PhotoInfoKey];
碰巧我收到有关空值的投诉。但是,如果我对photoInfo进行“打印描述”,则可以看到我的所有字段,并且正确填写。
最佳答案
使用这种方法
- (KNPhotoInfo) initWithPhotoDictionary:(NSDictionary *)dict
{
KNPhotoInfo *photoInfo = [[KNPhotoInfo alloc] init
photoinfo.url = dict[@"photo"][@"url"];
photoinfo.challenge = dict[@"photo"][@"challenge"];
photoinfo.user = dict[@"photo"][@"user"];
photoinfo.pubDate = dict[@"photo"][@"pub_date"];
return photoInfo;
}