代码之家  ›  专栏  ›  技术社区  ›  Rashad

调用代理时应用程序崩溃

  •  0
  • Rashad  · 技术社区  · 8 年前

    我有一个NSOperation类,它从一个相集生成大小图像。是这样的:

    #import "MultipleImageOperation.h"
    
    @implementation MultipleImageOperation
    
    @synthesize asset = _asset;
    @synthesize tag = _tag;
    @synthesize isLogo = _isLogo;
    @synthesize delegate = _delegate;
    
    -(id)initWithAsset:(PHAsset*) asset andTag:(NSUInteger)theTag andDelegate:(id<MultipleImageOperationDelegate>)theDelegate {
        if(self = [super init]) {
            _asset = asset;
            _tag = theTag;
            _delegate = theDelegate;
        }
        return self;
    }
    
    - (void)main {
        @autoreleasepool {
            __block UIImage *smallImage, *largeImage;
            if (self.isCancelled == NO){
                PHImageRequestOptions *requestOptions =  [[PHImageRequestOptions alloc] init];
                requestOptions.resizeMode   = PHImageRequestOptionsResizeModeExact;
                requestOptions.deliveryMode = PHImageRequestOptionsDeliveryModeHighQualityFormat;
                requestOptions.synchronous = true;
                NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
                NSString *documentsDirectory = [paths objectAtIndex:0];
                PHImageManager *manager = [PHImageManager defaultManager];
    
                [manager requestImageForAsset:_asset
                         targetSize:!_isLogo? LARGE_IMAGE_SIZE : COMPANY_LOGO_LARGE_SIZE
                         contentMode:PHImageContentModeAspectFit
                         options:requestOptions
                         resultHandler:^void(UIImage *image, NSDictionary *info) {
    
                             NSData *imageData = UIImagePNGRepresentation(image);
                             NSString *filename = [NSString stringWithFormat:@"/img_%f.png", [[Utils getCurrentDate] timeIntervalSince1970]];
                             NSString *tempPath = [documentsDirectory stringByAppendingString:filename];
                             [imageData writeToFile:tempPath atomically:YES];
                             largeImage = image;
                }];
                [manager requestImageForAsset:_asset
                         targetSize:!_isLogo? SMALL_IMAGE_SIZE : COMPANY_LOGO_SMALL_SIZE
                         contentMode:PHImageContentModeAspectFit
                         options:requestOptions
                         resultHandler:^void(UIImage *image, NSDictionary *info) {
    
                             smallImage = image;
                }];
                if ([self.delegate respondsToSelector:@selector(multipleImageProcessingOperationCompletedForTag:withSmallImage:andLargeImage:)]) {
                        [self.delegate multipleImageProcessingOperationCompletedForTag:_tag withSmallImage:smallImage andLargeImage:largeImage];
                }
    
            }
        }
    }
    
    
    @end
    

    - (void) multipleImageProcessingOperationCompletedForTag:(NSUInteger)tag withSmallImage:(UIImage *)smallImage andLargeImage:(UIImage*)largeImage {
        Media *tempMedia;
        tempMedia = [self.imagesList objectAtIndex:tag];
        tempMedia.smallImage = smallImage;
        tempMedia.mediaContent = largeImage;
        tempMedia.mediaContentSize = [NSNumber numberWithDouble:([Utils convertToNSDataFromUIImage:largeImage].length/BYTES_IN_GB)];
    
        [self updateImagesList:tempMedia];
        photoOperations--;
        if ( photoOperations == 0 ) {
            if ([self.delegate respondsToSelector:@selector(updateDisplay)]) {
                dispatch_async(dispatch_get_main_queue(), ^{
                    [self.delegate updateDisplay];
                });
            }
        }
    }
    

    小图像总是零!我受够了!

    1 回复  |  直到 8 年前
        1
  •  0
  •   Putz1103    8 年前

    [manager requestImageForAsset:_asset
        targetSize:!_isLogo? SMALL_IMAGE_SIZE : COMPANY_LOGO_SMALL_SIZE
        contentMode:PHImageContentModeAspectFit
        options:requestOptions
        resultHandler:^void(UIImage *image, NSDictionary *info) {
            smallImage = image;
            if ([self.delegate respondsToSelector:@selector(multipleImageProcessingOperationCompletedForTag:withSmallImage:andLargeImage:)]) 
            {
                [self.delegate multipleImageProcessingOperationCompletedForTag:_tag withSmallImage:smallImage andLargeImage:largeImage];
            }
    }];
    

    但您还必须确保大图像方法也已完成(以防它也是异步的)。

    推荐文章