我竭力要解決找出我的問題,釋放它實現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];
}
嗯,我的問題雖然是釋放包含隊列的對象,除非你建議我在隊列完成時調用[self release]? – Alex 2011-05-18 13:20:35
對不起,忘記了這個問題:(首先,你永遠不會釋放自我,這是沒有意義的。 我認爲你會更好的單身人士或靜態變量訪問所有你的下載類,我做在我的博客上寫了一篇關於這個確切用例的文章 這可能值得一看:http://pothibo.com/2011/02/06/nsobject-initialize-method-why-useful.html – 2011-05-23 13:03:09