Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 目标c帮助自定义委托和异步数据_Objective C_Core Data_Asynchronous_Delegates_Protocols - Fatal编程技术网

Objective c 目标c帮助自定义委托和异步数据

Objective c 目标c帮助自定义委托和异步数据,objective-c,core-data,asynchronous,delegates,protocols,Objective C,Core Data,Asynchronous,Delegates,Protocols,我正在将持久核心数据存储中的条目异步发布到web服务器。我想在成功发布后删除每个关联的托管对象 我的问题是,我同时填充存储并发布帖子,因此无法执行串行发布/删除操作。是否有方法标记要删除的对象,直到调用了关联的connectiondFinishLoading后再删除它 我还假设,通过使用异步NSURLRequests,应用程序生成多个NSURLConnections,并并发运行它们。我的假设错了吗 (更新)感谢优步仓鼠的建议,我尝试使用代理,但失败了。这就是我处理这个问题的方法。我在类中声明了

我正在将持久核心数据存储中的条目异步发布到web服务器。我想在成功发布后删除每个关联的托管对象

我的问题是,我同时填充存储并发布帖子,因此无法执行串行发布/删除操作。是否有方法标记要删除的对象,直到调用了关联的
connectiondFinishLoading
后再删除它

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


(更新)感谢优步仓鼠的建议,我尝试使用代理,但失败了。这就是我处理这个问题的方法。我在类中声明了一个协议来处理帖子,因为
connectiondifinishloading
就住在这个类中

@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

我想我做错的是让
myClass
成为代理
postCompleted
是为我写的每一篇文章调用的,但每次引用的都是最后一篇文章。有没有办法从回调函数中获取委托?

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


(作为对上一段的回应,我相信您的假设是正确的)

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


(作为对你最后一段的回应,我相信你的假设是正确的)

首先,课程应该以大写字母开头。以小写字母开头会使它们难以阅读。其次,@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];
}

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

首先,类应该以大写字母开头。以小写字母开头会使它们难以阅读。其次,@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];
}

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

感谢您的提示,我已经尝试实现代理,但我仍然坚持逻辑,我已经用我目前所做的更新了我的问题。Marcus下面的回答看起来很好,而且应该能帮到你。:)不幸的是,我没有资格对他的解决方案发表评论,但我想补充一点,如果您想避免对象泄漏,可以自动删除ConnectionDiFinishLoading:和connection…didFailWithError:中的MyUploadDelegate对象。一个或另一个将被调用,所以你可以确定它最终会被释放。我故意避免添加自动释放,因为释放你自己是丑陋的。代表(和联系)确实应该在外部进行跟踪和清理。感谢你们两位的回答!谢谢你的提示,我已经尝试实现了委托,但我仍然坚持逻辑,我已经用我目前所做的更新了我的问题。马库斯下面的回答看起来很好,应该可以帮助你解决问题。:)不幸的是,我没有资格对他的解决方案发表评论,但我想补充一点,如果您想避免对象泄漏,可以自动删除ConnectionDiFinishLoading:和connection…didFailWithError:中的MyUploadDelegate对象。一个或另一个将被调用,所以你可以确定它最终会被释放。我故意避免添加自动释放,因为释放你自己是丑陋的。代表(和联系)确实应该在外部进行跟踪和清理。感谢你们两位的回答!在创建时自动释放委托对象可以解决内存泄漏问题。MyUploadDelegate*delegate=[[[MyUploadDelegate alloc]init]autorelease];我已经测试过了,不能想出任何可能失败的边缘情况。除非你没有办法取消连接,例如当你进入后台或接到电话时。保持对代理和连接的跟踪是设备上的好公民。在创建时自动删除代理对象可以解决内存泄漏问题。MyUploadDelegate*delegate=[[[MyUploadDelegate alloc]init]autorelease];我已经测试过了,不能想出任何可能失败的边缘情况。除非你没有办法取消连接,例如当你进入后台或接到电话时。保持对代理和连接的跟踪是设备上的好公民。