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),则未完成下载的图像的关联消息突然变为nil
    managedObjectContext

    以下是相关代码:

        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);
        }
    }];