2010-11-06 32 views
0

我從永久核心數據存儲異步地發佈到Web服務器的條目。我希望在成功發佈後刪除每個關聯的託管對象。客戶c與自定義代理和異步數據的幫助

我的問題是,我同時填充商店和發佈帖子,所以我不能做一個系列發佈/刪除操作。有沒有辦法標記對象進行刪除直到它與connectionDidFinishLoading調用相關聯,然後刪除它?

我還假設通過使用異步NSURLRequests,應用程序會生成多個NSURLConnections並同時運行它們。這個假設我錯了嗎?


(更新)由於Uberhamster的建議,我嘗試使用代表,但我失敗了。這就是我正在解決這個問題的方法。我已經在處理帖子的類中聲明瞭一個協議,因爲這是connectionDidFinishLoading的生命。

@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 

而且在從持久存儲抓住數據,併產生NSURLConnections這就是我正在做的類:

@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

首先,類應以大寫字母開頭。以小寫字母開頭使他們難以閱讀。其次,@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]; 
} 

你也應該有代表的一些保留,這樣就可以保持追蹤它們並清理它們(上面的示例代碼泄露了代表)。

+0

在創建時自動釋放委託對象處理內存泄漏。MyUploadDelegate * delegate = [[[MyUploadDelegate alloc] init] autorelease];我已經測試過,並且不能提出任何會失敗的邊緣情況。 – CodeWombat 2010-11-11 22:08:52

+0

除非您無法取消連接,例如,當您進入後臺或打電話時。保持跟蹤代表和連接是設備上的好公民。 – 2010-11-11 22:38:50

1

您可以爲每個觸發的NSURLRequest實例化一個委託對象,並且該委託對象可以引用正在處理的核心數據項。之後,您可以在回調中從商店中刪除相應的核心數據對象,並且所有內容都應該是花哨的。

(在回答你的最後一段,我相信你是正確的這一假設)

+0

感謝您的提示,我試圖實現代表,但我堅持的邏輯,我已經更新了我的問題,迄今爲止我所做的。 – CodeWombat 2010-11-11 06:50:14

+0

馬庫斯的答案看起來不錯,應該幫助你。 :)不幸的是,我缺乏聲譽-fu來評論他的解決方案,但我想補充一點,你可以自動釋放connectionDidFinishLoading中的MyUploadDelegate對象:和connection ... didFailWithError :,如果你想避免泄漏對象。其中一個或另一個將被調用,所以你可以確定它最終會被釋放。 – 2010-11-11 13:44:23

+0

我特意避免添加autorelease,因爲釋放自己很醜。代表(和連接)真的應該被跟蹤和清理外部。 – 2010-11-11 14:07:24