изображения не добавляются в NSMutableDictionary, который находится в пределах NSOperation - PullRequest
0 голосов
/ 06 февраля 2011

Итак, я сначала закодировал все свои методы в контроллере представления с помощью NSOperationQueue.Проведя некоторые исследования и много прочитав, я понял, что мне нужно разделить мою операцию loadImage, чтобы я мог использовать isCancelled и cancelAllOperations.Поэтому я решил создать класс nsoperation и вызвать его из моего viewcontroller.ALI методы вызываются, даже imageLoaded, но NSMutableDictionary остается пустым.Я использую словарь для заполнения ячеек таблицы, используя URL в качестве ключа.Также имейте в виду, что вызов операции в 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

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 Ответ

1 голос
/ 06 февраля 2011

Если это работает без исключений, а словарь по-прежнему пуст, это, скорее всего, означает, что ваше значение равно nil.

Это распространенная проблема с кодом, подобным тому, где вы получаете результат одного методав следующий.В любой момент, если возникнет проблема, все остальные цепочки не будут работать.

Чтобы решить эту проблему, я бы начал прямо с того места, где вы присвоили изображение словарю.Вы можете использовать либо точку останова, либо NSLog, чтобы определить значение изображения в этой точке.Я предпочитаю использовать NSLog, но точка останова позволит вам взглянуть на все значения одновременно.Если scaledImage - ноль, тогда проверьте myImage.Продолжайте идти вверх по цепочке, пока не найдете точку, где значение переходит от того, что вы ожидаете, к нулю.

...