2

我竭力要解決找出我的問題,釋放它實現NSOperationQueue和異步對象的正確方法要求

我有一個下載類,其處理與我的API調用,這些調用被添加到一個NSOperationQueue 。每次呼叫都會分配一個完成且失敗的通知程序,當通話完成或發生故障時,該通知程序即爲發帖。然後,我可以優雅地處理視圖控制器中的請求完成/失敗。

我遇到的問題是,這是什麼正確的方式來分配/ init /釋放我的下載類。我的第一種方法是這樣的:

每當我需要運行一個請求時,爲init分配一個新的下載類的實例,然後我可以有一個獨特的類實例,具有唯一的完整和失敗的通知和其他參數,因爲我所以願意。我用這種方法遇到的問題是何時/如何釋放對象。我不能簡單地調用獲取請求,然後在同一個調用中釋放對象,因爲下載調用有隊列完成和通知發佈,我知道下載類的實例何時完成了它的調用,因爲通知,我只是不知道從另一個函數中實現它的正確方式。 e.g:

-(void)downloadLists:(int)page featured:(BOOL)featured { 

    NSMutableDictionary *postValues = [NSMutableDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:page],@"page",@"false",@"is_featured", nil]; 

    if(featured){ 
     [postValues setValue:@"true" forKey:@"is_featured"]; 
    } 

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *destination = [[paths objectAtIndex:0] stringByAppendingPathComponent:[NSString stringWithFormat:@"lists_%i.json",page]]; 

    Download *download = [[Download alloc] init]; 
    [download setCompleteNotifier:@"listsComplete"]; 
    [download setFailedNotifier:@"listsFailed"]; 
    [download downloadPOST:[NSURL URLWithString:@"http://blahblah"] values:postValues destination:destination]; 

} 

然後我在哪裏發佈下載,並確保我放開了正確的實例,downloadLists可稱爲(n)的快速連續的時間量。

我的另一種方法是使用Download的單例,這很好,直到我需要將userinfo添加到通知中,這當然會被從不同地方調用的單例類變得混亂。

任何幫助,將不勝感激,這裏是供您參考downloadPOST功能:

-(void)downloadPOST:(NSURL *)path values:(NSDictionary *)keyValues destination:(NSString *)destination { 

    ASIFormDataRequest *formRequest = [ASIFormDataRequest requestWithURL:path]; 

    for(id key in keyValues){ 
     [formRequest setPostValue:[keyValues objectForKey:key] forKey:key]; 
    } 

    [formRequest setDownloadDestinationPath:destination]; 
    [formRequest setDelegate:self]; 
    [formRequest setDidFinishSelector:@selector(requestDone:)]; 
    [formRequest setDidFailSelector:@selector(requestWentWrong:)]; 
    [queue addOperation:formRequest]; 

} 

回答

2

的隊列應該是處理釋放對象之一。這裏有幾個選項。

  1. 您可以使用NSNotification發佈您的最終狀態,該隊列偵聽並刪除發送該通知

  2. 您可以創建&隊列中的下載之間的私人委託實例,其中隊列得到通知

  3. 你可以在你的下載類(即BOOL completed)中設置布爾@property。隊列保留下載實例,並向完成的KVC添加監聽器。當完成設置爲YES時,它釋放對象

阿法克,您使用ASIHTTPRequest來處理所有的給你,所以我不知道爲什麼要重做這個

+0

嗯,我的問題雖然是釋放包含隊列的對象,除非你建議我在隊列完成時調用[self release]? – Alex 2011-05-18 13:20:35

+0

對不起,忘記了這個問題:(首先,你永遠不會釋放自我,這是沒有意義的。 我認爲你會更好的單身人士或靜態變量訪問所有你的下載類,我做在我的博客上寫了一篇關於這個確切用例的文章 這可能值得一看:http://pothibo.com/2011/02/06/nsobject-initialize-method-why-useful.html – 2011-05-23 13:03:09

0

好像你'重新包裝功能默認已包含在ASIHTTPRequest中。該ASI類具有內置的委託通知您完成或失敗的:

- (void)requestFinished:(ASIHTTPRequest *)request; 
- (void)requestFailed:(ASIHTTPRequest *)request; 

有沒有你不能只是建立在你的主類的要求,而無需創建下載類中的任何其他原因,然後讓代表讓你知道什麼時候完成了嗎?

+0

試圖儘可能地使它變得靈活和可重用,看起來我做了相反的事情,並且使它變得不必要的複雜,我將砍掉我的下載類。 – Alex 2011-05-19 08:41:19

相關問題