RestKit .2 将图像发布到 Web 服务 - 空实体错误

Posted

技术标签:

【中文标题】RestKit .2 将图像发布到 Web 服务 - 空实体错误【英文标题】:RestKit .2 Posting Images to web service - Null Entity Error 【发布时间】:2013-04-23 17:28:56 【问题描述】:

我正在使用 RestKit 将图像发布到 Web 服务,并且它们可以正常发布,服务器会发回 200。发生的事情是我收到以下错误:

*** 由于未捕获的异常'NSUnknownKeyException'而终止应用程序,原因:'[valueForUndefinedKey:]:实体(null)不符合键值编码的键值“resource_updated_at”。'

这是我用来发布图片的方法。我希望有一些明显的东西我遗漏了。我发现了一篇类似的帖子,其中提到核心数据堆栈可能没有正确设置,但我不确定如何设置。我正在使用 RestKit 发布其他标准表单数据,它返回和映射就好了。

- (void)postImagesFromInventory:(NSManagedObject *)inventory 
    NSLog(@"######## postImagesFromInventory ########");

    // if there are photos that aren't synced, post the first one
    int postingImageNumber = 0;

    RKObjectManager *manager = [RKObjectManager managerWithBaseURL:[NSURL URLWithString:BASE_URL]];

    // send for each image in inventory
    for (Image *image in [[inventory valueForKey:@"image"] allObjects]) 
        postingImageNumber = postingImageNumber + 1;
        [SVProgressHUD setStatus:[NSString stringWithFormat:@"Posting image %d of %d for inventory %@", postingImageNumber, [[inventory valueForKey:@"image"] allObjects].count, [inventory valueForKey:@"asset_name"]]];

        // make sure it's not already synced
        if (![image valueForKey:@"synced"]) 
            NSLog(@"-------------------------------------");
            NSLog(@"need to post image for inventory %@",[inventory valueForKey:@"inventory_id"]);

            NSURL *imagePath = [NSURL URLWithString:[image valueForKey:@"path"]];

            // need to get my image from Asset Library
            ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
            __block NSNumber *imageSize = nil;
            __block UIImage *myImage = nil;
            __block Image *blockImage = nil;
            __block NSData *blockImageData = nil;

            [library assetForURL:imagePath resultBlock:^(ALAsset *asset) 
                myImage = [UIImage imageWithCGImage:[[asset defaultRepresentation] fullResolutionImage]];
                imageSize = [NSNumber numberWithLongLong:asset.defaultRepresentation.size];

                // make the image available on callback
                blockImage = image;

                NSData *imageData = UIImageJPEGRepresentation(myImage, 1.0);
                blockImageData = imageData;

                NSMutableURLRequest *request = [manager multipartFormRequestWithObject:inventory method:RKRequestMethodPOST path:IMAGES_ENDPOINT parameters:@@"auth_token":@"my_auth_token",@"image" : @@"asset_inventory_id":[inventory valueForKey:@"inventory_id"],@"resource_content_type":@"image/jpeg",@"resource_file_name":[NSString stringWithFormat:@"%@_image.jpg",[inventory valueForKey:@"asset_name"]],@"resource_file_size": [NSString stringWithFormat:@"%@",imageSize] constructingBodyWithBlock:^(id<AFMultipartFormData> formData) 
               [formData appendPartWithFileData:imageData
                                           name:@"image[resource]"
                                       fileName:[NSString stringWithFormat:@"%@_image.jpg",[inventory valueForKey:@"asset_name"]]
                                       mimeType:@"image/jpeg"];
            ];

            RKEntityMapping *mapping = [RKEntityMapping mappingForEntityForName:@"Image" inManagedObjectStore:_managedStore];
            [mapping addAttributeMappingsFromDictionary:@@"resource_updated_at":@"resource_updated_at"];
            [mapping mappingForDestinationKeyPath:@"image"];


            RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:mapping pathPattern:nil keyPath:nil statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];

            [manager addResponseDescriptor:responseDescriptor];

            RKObjectRequestOperation *operation = [manager objectRequestOperationWithRequest:request success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) 
                NSLog(@"operation successful");
             failure:^(RKObjectRequestOperation *operation, NSError *error) 
                NSLog(@"operation failed");
            ];

            // queue up the operation
            [manager enqueueObjectRequestOperation:operation];

            // library access failure
             failureBlock:^(NSError *error) 
                NSLog(@"error : %@", error);
            ];
        
    

另外,这是我设置RKManagedObjectStoreinit 方法,以防万一。

- (PSNDataSync *)init 
    RKLogConfigureByName("RestKit/Network*", RKLogLevelDebug);
    RKLogConfigureByName("RestKit/ObjectMapping", RKLogLevelDebug);

    PSNAppDelegate *appDelegate = (PSNAppDelegate *)[[UIApplication sharedApplication] delegate];
    _context = [appDelegate managedObjectContext];
    _managedStore = [[RKManagedObjectStore alloc] initWithManagedObjectModel:[appDelegate managedObjectModel]];

    _currentInventory = nil;
    _imagesArray = nil;

    // initialize imagesArray for loading inventoryCollectionView
    _imagesArray = [[NSMutableArray alloc]init];

    return self;

这是代表Core Data EntityImage class

#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>

@class Inventory;

@interface Image : NSManagedObject

@property (nonatomic, retain) NSString * path;
@property (nonatomic, retain) NSString * resource_updated_at;
@property (nonatomic, retain) NSNumber * synced;
@property (nonatomic, retain) Inventory *inventory;

@end

我会提出免责声明,这可能不是最好的代码.. 但如果您看到错误,请告诉我:]。

【问题讨论】:

“Image”类的定义是什么,它是否与数据模型中的定义正确匹配?自 Xcode 生成后,该类是否被编辑过? Wain,我已经添加了 Image 类。当您询问定义时,我实际上进入并删除了旧的图像类并根据当前重新生成了一个新的(上图)模型。我这样做只是因为我确实修改了实体,不久前添加了 resource_updated_at 属性。然而,结果还是一样。希望你或其他人能看到别的东西。 更改数据模型后是否清理了项目?可能也会从应用程序中删除旧的数据存储文件。 是的.. 清理项目并在我更改模型时始终从模拟器中完全删除应用程序。 我还添加了我的 init 方法,其中设置了 managedObjectStore 和 managedObjectContext。 【参考方案1】:

我有完全相同的错误。您需要使用 RKObjectRequestOperation (RKManagedObjectRequestOperation) 的托管版本。

【讨论】:

做到了.. 非常感谢!我为此苦苦挣扎了 2 天,最后只是做了一个解决方法,所以我可以继续.. 这使它正确.. 再次感谢!【参考方案2】:

由于您正在处理 Core Data,因此您需要使用 RKManagedObjectRequestOperation 而不是 RKObjectRequestOperation。

【讨论】:

以上是关于RestKit .2 将图像发布到 Web 服务 - 空实体错误的主要内容,如果未能解决你的问题,请参考以下文章

RestKit 图片上传

带有图像的 Restkit MultiForm 帖子

使用 Restkit 上传图像 - 向 UITableView 添加两行而不是一行

RestKit 和核心数据 - 如何发布数据?

Restkit:multipartFormRequestWithObject 不是 json

Restkit + Objective-c - 多次调用同一个 Web 服务