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

objective c帮助处理自定义委托和异步数据

  •  0
  • CodeWombat  · 技术社区  · 15 年前

    我的问题是,我正在同时填充存储和制作帖子,因此无法执行连续的帖子/删除操作。是否有方法标记要删除的对象,直到它关联 connectionDidFinishLoading 已经打过电话,然后删除它?

    我还假设通过使用异步 NSURLRequests ,应用程序生成多个 NSURLConnections 同时运行它们。我的假设是错的吗?


    (更新)多亏Uberhamster的建议,我尝试使用代理,但我失败了。这就是我处理这个问题的方式。我在处理posts的类中声明了一个协议,因为这就是 生活。

    @protocol postDelegate 
    @optional
    - (void)postCompleted;
    @end
    
    @interface makePosts : NSObject {
         //...
         id <postsDelegate> delegate;
    }
    
    @property (nonatomic, assign) id <postsDelegate> delegate;
    //...
    @end
    
    @implementation makePosts
        @synthesize delegate;
        //...
        - (void) connectionDidFinishLoading {
            [delegate postCompleted];
        }
        //...
    @end
    

    在从持久存储中获取数据并生成 这就是我要做的:

    @interface myClass <postsDelegate>
        //...
        makePosts* makePostsObject;
    @end
    
    @implementation myClass
    - (void) batchPost {
          //...
          for(NSManagedObject* obj in items) {
              makePostsObject = [[makePosts alloc] init]; 
              makePostsObject.delegate = self;
              [makePostsObject setEntryName:[obj valueForKey:@"name"]]; // set reference here
              NSString* post_data = [NSString stringWithString:[self createXMLPost:obj]];
              [makePostsObject postdata:[obj valueForKey:@"name"]];
              [makePostsObject release];
        }
    
    
          - (void) postCompleted
            {
                 NSLog(@"posted entry for: %@", makePostsObject.entryName);
            }
    
    @end
    

    我想我做错的是 myClass postCompleted 我发的每一篇文章都会被引用,但每次的引用都是最后一篇文章。有办法从回调函数中获取委托吗?

    2 回复  |  直到 15 年前
        1
  •  2
  •   Marcus S. Zarra    15 年前

    首先,课程应该以大写字母开头。以小写字母开头会使它们很难阅读。其次,@Uberhamster建议您实现 NSURLConnection 委派如下:

    @interface MyUploadDelegate : NSObject
    
    @property (nonatomic, retain) NSManagedObject *postObject;
    
    @end
    
    @implementation MyUploadDelegate
    
    @synthesize postObject;
    
    - (void)dealloc
    {
      [postObject release], postObject = nil;
      [super dealloc];
    }
    
    - (void)connectionDidFinishLoading:(NSURLConnection*)connection
    {
      //Connection is done, delete the object
      [[[self postObject] managedObjectContext] deleteObject:[self postObject]];
    }
    
    - (void)connection:(NSURLConnection*)connection didFailWithError:(NSError*)error
    {
      //Deal with the error
    }
    
    @end
    

    那么您的代码只需要:

    for (NSManagedObject *postObject in items) {
      MyUploadDelegate *delegate = [[MyUploadDelegate alloc] init];
      [delegate setPostObject:postObject];
    
      NSURLRequest *request = ...;
      [NSURLConnection connectionWithRequest:request delegate:delegate];
    }
    

    您还应该保留一些委托,以便跟踪和清理它们(上面的示例代码泄漏了委托)。

        2
  •  1
  •   Jonathan Zhan    15 年前

    您可以为每个发出的NSURLRequest实例化一个委托对象,并且该委托对象可以具有对正在处理的核心数据项的引用。之后,您可以从回调中的存储中删除相应的核心数据对象,一切都应该很好。

    (针对你的最后一段,我认为你的假设是正确的)