这是一个令人痛苦的新手问题,但在这里我正在学习一种新的语言和框架,我试图回答“什么是真理?”这个问题。与Obj-C有关。
我正在尝试通过网络延迟加载图片。我有一个名为Event的数据类,其属性包括:
@property (nonatomic, retain) UIImage image;
@property (nonatomic, retain) UIImage thumbnail;
在我的AppDelegate中,我获取了大量关于我的事件的数据(这是一个显示本地艺术事件列表的应用程序),并将每个event.image预先设置为我的默认“no-image.png”。 / p>
然后在我查看这些内容的UITableViewController中,我这样做:
if (thisEvent.image == NULL) {
NSLog(@"Going for this item's image");
UIImage *tempImage = [UIImage imageWithData:[NSData dataWithContentsOfURL:
[NSURL URLWithString:
[NSString stringWithFormat:
@"http://www.mysite.com/content_elements/%@_image_1.jpg",
thisEvent.guid]]]];
thisEvent.image = tempImage;
}
我们永远不会得到NSLog电话。测试thisEvent.image的NULL不是问题。我也尝试了== nil
,但这也行不通。
答案 0 :(得分:4)
如果你将image设置为no-image.png,它将不会是nil(Objective-C使用nil作为对象值,你应该使用它而不是NULL,它有不同的用途,尽管它具有相同的值)。
答案 1 :(得分:4)
延迟加载将如下所示:
@property (nonatomic, read-only) UIImage *image;
- (UIImage *)image {
if (!image) {
image = [[UIImage imageWithData:[NSData dataWithContentsOfURL:
[NSURL URLWithString:
[NSString stringWithFormat:
@"http://www.mysite.com/content_elements/%@_image_1.jpg",
thisEvent.guid]]]] retain];
}
return image;
}
不要忘记在dealloc中发布图片。
此致
答案 2 :(得分:2)
您真的不想在构建表格单元格时从网络加载图像,您的表格滚动速度会非常慢。
请参阅Apple的示例LazyTableImages了解如何执行此操作,this SO question也可能有所帮助。