iOS中的NSOperation-如何处理循环和嵌套的NSOperation调用以获取图像
我需要帮助了解如何适当处理以下用例: 假设我正在编写聊天应用程序:iOS中的NSOperation-如何处理循环和嵌套的NSOperation调用以获取图像,ios,asynchronous,nsmanagedobject,nsmanagedobjectcontext,nsoperation,Ios,Asynchronous,Nsmanagedobject,Nsmanagedobjectcontext,Nsoperation,我需要帮助了解如何适当处理以下用例: 假设我正在编写聊天应用程序: 发布应用程序 要求服务器(AFHTTPRequestOperation)提供所有新消息的列表 循环浏览这些消息,看看我是否需要下载任何图像 如果是,则再次调用服务器(AFImageRequestOperation)以获取图像 我的托管对象“消息”不再在同一上下文中,但我只使用了一个managedObjectContext,因此不断发生崩溃 这是因为我嵌套调用的方式,因为它们是异步的吗?我几乎可以肯定的是,这条消息没有在其他地方被
AFHTTPRequestOperation
)提供所有新消息的列表AFImageRequestOperation
)以获取图像managedObjectContext
,因此不断发生崩溃
这是因为我嵌套调用的方式,因为它们是异步的吗?我几乎可以肯定的是,这条消息没有在其他地方被删除,因为我看到了它
需要注意的一点是,当我更改视图控制器时,这种情况似乎会发生。我启动应用程序,在根视图控制器(RVC)上,它执行上面的第2步。如果我在下载所有图像之前点击进入“MessageListViewController
”(MLVC),则未完成下载的图像的关联消息突然变为nilmanagedObjectContext
以下是相关代码:
AFHTTPRequestOperation * operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:requestImageInfoURL
success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
NSDictionary * JSONresponse = (NSDictionary *)JSON;
if( [[[JSONresponse objectForKey:@"status"] uppercaseString] isEqualToString:@"ERROR"] )
{
for( id<CommsObserver> observer in _observers )
[observer errorOccurred:[JSONresponse objectForKey:@"message"]];
}
else
{
if( [JSONresponse containsKey:@"convoMessages"] )
{
NSArray * messageList = [JSON objectForKey:@"messages"];
for( int i = 0 ; i < messageList.count ; i++ )
{
__block ConversationMessage * message = [JSONUtility convoMessageFromJSON:[messageList objectAtIndex:i]];
if( !message )
NSLog( @"Couldn't create the new message..." );
else
{
message.unread = [NSNumber numberWithBool:YES];
[[DataController sharedController] saveContext];
if( (!message.text || [message.text isEqualToString:@""]) && (message.image || message.imageInfoKey) )
{
NSString * imageURL = (message.image ? [Comms urlStringForImageInfo:message.image] : [Comms urlStringForImageKey:message.imageInfoKey extension:message.imageInfoExt]);
NSURLRequest *requestImageURL = [NSURLRequest requestWithURL:[NSURL URLWithString:imageURL]];
AFImageRequestOperation * imageOperation;
imageOperation = [AFImageRequestOperation imageRequestOperationWithRequest:requestImageURL
imageProcessingBlock:^UIImage *(UIImage *image) {
return image;
} success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) {
if( message.image )
{
NSLog( @"updating imageInfo for message" );
[Utilities updateImageInfo:message.image
withImage:image
asPreview:YES
asThumbnail:YES
preserveSize:YES];
}
else
{
NSLog( @"creating a new imageInfo for message" );
ImageInfo * imageInfo = [Utilities createImageInfoFromImage:image asPreview:NO asThumbnail:NO preserveSize:YES];
if( imageInfo.managedObjectContext == nil )
NSLog( @"imageInfo MOC is NIL" );
else if( message.managedObjectContext == nil )
{
NSLog( @"message MOC is NIL" );
message = [[DataController sharedController] convoMessageForKey:message.key];
if( !message )
NSLog( @"message is NIL, meaning it wasn't found in the MOC" );
else if( !message.managedObjectContext )
NSLog( @"message MOC was STILL NIL" );
else
NSLog( @"problem solved..." );
}
if( imageInfo )
[[DataController sharedController] associateImageInfo:imageInfo withMessage:message];
}
[[DataController sharedController] saveContext];
} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error) {
NSLog( @"Image DOWNLOAD error... \n%@" , [NSString stringWithFormat:@"%@" , error] );
}];
[imageOperation start];
}
for( id<CommsObserver> observer in _observers )
[observer newConvoMessages:@[message.key]];
}
} // End for loop of messageList
} // End if JSONresponse
} // End outer if ERROR statement
} // End Success
failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {
NSLog( @"Error: \n%@" , [NSString stringWithFormat:@"%@" , error] );
}
];
[operation start];
AFHTTPRequestOperation*operation=[AFJSONRequestOperation JSONRequestOperationWithRequest:requestImageInfoURL
成功:^(NSURLRequest*请求,NSHTTPURLResponse*响应,id JSON){
NSDictionary*JSONresponse=(NSDictionary*)JSON;
如果([[JSONresponse objectForKey:@“状态”]uppercaseString]IseQualtString:@“错误”])
{
for(id观察员在_观察员中)
[observer ErrorOccessed:[JSONresponse objectForKey:@“message”];
}
其他的
{
if([JSONresponse containsKey:@“ConvalMessages”])
{
NSArray*messageList=[JSON objectForKey:@“messages”];
for(int i=0;i [[DataController sharedController] saveContext];
[[DataController sharedController].managedObjectContext performBlock:^{
assert(message.managedObjectContext == [DataController sharedController].managedObjectContext);
message.unread = [NSNumber numberWithBool:YES];
[[DataController sharedController] saveContext];
...
}];
NSManagedObjectContext* context = [[NSManagedObjectContext alloc]
initWithConcurrencyType:NSPrivateQueueConcurrencyType];
__block NSManagedObject* obj;
[context performBlockAndWait:^{
obj = [context objectRegisteredForID:theObjectID];
}];
NSString* name = obj.name;
__block NSString* name;
[obj.managedObjectContext performBlockAndWait:^{
name = obj.name;
}];
NSManagedObjectID* moid = obj.objectID; // safe from any thread
NSManagedObjectID* moid = obj.objectID
NSManagedObjectContext* otherContext = [[NSManagedObjectContext alloc]
initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[otherContext performBlock:^{
NSManagedObject* obj = [otherContext objectWithID: moid];
...
}];
__block NSManagedObject* obj;
__block NSError* error;
[context performBlockAndWait:^{
obj = [context existingObjectWithID:theObjectID error:&error];
}];
if (obj==nil) {
NSLog(@"Error:%@", error);
}
__block NSManagedObject* obj;
[context performBlock:^{
NSError* error;
obj = [context existingObjectWithID:theObjectID error:&error];
if (obj==nil) {
NSLog(@"Error:%@", error);
}
}];