图像未添加到NSMutableDictionary,它位于NSOperation中

时间:2011-02-05 23:45:52

标签: iphone cocoa uiimage nsmutabledictionary nsoperation

所以我首先在一个带有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];

    }

1 个答案:

答案 0 :(得分:1)

如果此操作没有例外且字典仍为空,则很可能意味着您的值为零。

这是代码的常见问题,就像你有一个方法进入下一个方法的结果。在任何情况下,如果出现问题,链中的其余部分都将无效。

要解决这个问题,我会从您将图像分配到字典的上方开始。您可以使用断点或NSLog来确定该点的图像值。我更喜欢使用NSLog,但是一个断点可以让你一次查看所有的值。如果scaledImage为nil,则检查myImage。继续向上链,直到找到价值从你期望的点到零的点。