所以我首先在一个带有NSOperationQueue的viewcontroller中编写了所有方法。在做了一些研究和大量阅读后,我意识到我必须继承我的loadImage操作,以便我可以使用isCancelled和cancelAllOperations。所以我继续创建了一个nsoperation类,并从我的viewcontroller中调用它。 ALl调用方法,甚至是imageLoaded,但NSMutableDictionary仍为空。我使用字典来填充我的tableviewcells,使用url作为Key。还要注意,viewcontroller中的操作调用是在视图加载时由NSInvocationOperation调用的方法内。
@interface loadImages : NSOperation {
NSURL *targetURL;
}
@property(retain) NSURL *targetURL;
- (id)initWithURL:(NSURL*)url;
@end
实现nsoperation类,其中包括一些调整图像大小的其他调用
@implementation loadImages
@synthesize targetURL;
- (id)initWithURL:(NSURL*)url
{
if (![super init]) return nil;
[self setTargetURL:url];
return self;
}
- (void)dealloc {
[targetURL release], targetURL = nil;
[super dealloc];
}
- (void)main {
NSLog(@"loadImages.m reached");
StoriesTableViewController *stories = [[StoriesTableViewController alloc] init];
NSMutableDictionary *tempDict = stories.filteredImagesDict;
UIImage *myImage = [[[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[self targetURL]]]autorelease];
UIImage *scaledImage = [[[UIImage alloc] init] autorelease];
CGRect frame = CGRectMake(100.0f, 100.0f, 180.0f, 180.0f);
UIImageView *myImageFrame = [[UIImageView alloc] initWithFrame:frame];
myImage = [[myImage croppedImage:[myImageFrame bounds]]retain];
scaledImage = [[myImage resizedImage:CGSizeMake(120.0f, 120.0f) interpolationQuality:kCGInterpolationHigh]retain];
[tempDict setValue:scaledImage forKey:[self targetURL]];
[stories performSelectorOnMainThread:@selector(imageLoaded:)
withObject:myImage
waitUntilDone:YES];
NSLog(@"targetURL %@",[self targetURL]);
NSLog(@"tempDict count: %d",tempDict.count);
[stories release];
[myImage release];
[myImageFrame release];
[scaledImage release];
}
在viewcontroller上创建nsoperation
for(int i=0;i<storyQuantity;i++) {
NSString *imageString = [[[storiesArray objectAtIndex:i] objectForKey: @"image"] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; // must add trimming to remove characters
NSURL *url = [NSURL URLWithString:imageString];
loadImages *imageOperation = [[loadImages alloc] initWithURL:url];
[queue_ addOperation:imageOperation];
[imageOperation release];
}
答案 0 :(得分:1)
如果此操作没有例外且字典仍为空,则很可能意味着您的值为零。
这是代码的常见问题,就像你有一个方法进入下一个方法的结果。在任何情况下,如果出现问题,链中的其余部分都将无效。
要解决这个问题,我会从您将图像分配到字典的上方开始。您可以使用断点或NSLog来确定该点的图像值。我更喜欢使用NSLog,但是一个断点可以让你一次查看所有的值。如果scaledImage为nil,则检查myImage。继续向上链,直到找到价值从你期望的点到零的点。