0

我必須上傳多個文件,跟蹤其進度&訂閱完成&故障塊才能在操作結束時顯示相關消息。使用AFNetworking上傳多個文件 - UIViewController不會釋放

我寫了我自己的AFHTTPClient包裝器並創建了下面的方法。

- (void) uploadFiles:(NSArray*)files 
       path:(NSString*)path 
      parameters:(NSDictionary*)parameters 
     progressBlock:(void (^)(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite))block 
      success:(void (^)(AFHTTPRequestOperation *, id))success failure:(void (^)(AFHTTPRequestOperation *, NSError *))failure 
{ 
    NSMutableURLRequest *request = 
    [self multipartFormRequestWithMethod:@"POST" 
            path:path 
           parameters:parameters 
       constructingBodyWithBlock: 
    ^(id <AFMultipartFormData>formData) { 

     for (CRLMultiPartFile *file in files) { 
      NSAssert(file.name, @"Name cannot be nil"); 
      NSAssert(file.file, @"Nothing found to upload"); 
      NSAssert(file.filename, @"FileName cannot be nil"); 
      NSAssert(file.mimeType, @"Must set Mime-Type for %@", file.filename); 
      [formData appendPartWithFileData:file.file name:file.name fileName:file.filename mimeType:file.typeString]; 
     } 
    }]; 

    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request]; 
    [operation setUploadProgressBlock:block]; 
    [operation setCompletionBlockWithSuccess:success failure:failure]; 
    [self enqueueHTTPRequestOperation:operation]; 
} 

調用此方法沒有得到解除分配,並且因此所有包含的圖像被保留在存儲器中,以及因此導致內存泄漏和最終存儲器警告視圖控制器。

做的分析表明,在整個操作結束時,視圖控制器具有refCount 1.

當我調用註釋掉,在上傳文件時,一切工作正常。

這是控制器中的代碼。它使用進度模塊更新用戶界面上的元素。

NSMutableDictionary *params = [[NSMutableDictionary alloc] init]; 
ContactModel *model = (ContactModel*)[self.contacts lastObject]; 
[params setObject:model.phone forKey:@"receiver"]; 

__block typeof(self) sSelf = self; 

[[JMClient sharedClient] uploadFiles:files 
           path:@"picture_share/" 
          parameters:params 
         progressBlock:^(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite) { 

          CGFloat progPercent = ceilf(((CGFloat)totalBytesWritten/(CGFloat)totalBytesExpectedToWrite) * 100); 

          CGFloat widthToCut = (progPercent * sSelf.progWidth)/100; 

          CGRect frame = sSelf.progresViewBG.frame; 
          frame.size.width = (sSelf.progWidth - widthToCut); 
          frame.origin.x = (sSelf.progOrigin + widthToCut); 
          sSelf.progresViewBG.frame = frame; 

          sSelf.progLabel.text = [NSString stringWithFormat:@"%i%%", (int)progPercent]; 

          frame = sSelf.progTipView.frame; 
          frame.origin.x = (sSelf.progresViewBG.frame.origin.x - frame.size.width/2); 
          sSelf.progTipView.frame = frame; 

          frame = sSelf.progLabel.frame; 
          frame.origin.x = (sSelf.progresViewBG.frame.origin.x - frame.size.width/2); 
          sSelf.progLabel.frame = frame; 

         } success:^(AFHTTPRequestOperation *success, id reponse) { 

          CGRect frame = sSelf.progresViewBG.frame; 
          frame.size.width = 0; 
          frame.origin.x = sSelf.progOrigin; 
          sSelf.progresViewBG.frame = frame; 
          [sSelf.cancelButton setImage:[UIImage imageNamed:@"trnsfr_prgss_complt.png"] forState:UIControlStateNormal]; 

          [sSelf performSelector:@selector(hideAwayProgressBars) withObject:nil afterDelay:3]; 

         } failure:^(AFHTTPRequestOperation *failure, NSError *error) { 

          [Mediator showMessage:TGLocalizedString(kMessageKeyForUploadingFailed)]; 
          [sSelf performSelector:@selector(hideAwayProgressBars) withObject:nil afterDelay:3]; 

         }]; 

self.operation = [[self.client.sharedClient.operationQueue operations] lastObject]; 

- (void) hideAwayProgressBars 
{ 
    [[NSNotificationCenter defaultCenter] postNotificationName:kNotifcationKeyForPhotoUploadComplete object:nil]; 
} 

通知由父控制器接收,它從超級視圖中刪除此控制器的視圖,並將其設置爲零。

P.S. CRLMultiPartFile是一個自定義的類來保存,如果你正在使用ARC文件的屬性被上傳

回答

1

,你應該使用__weak代替__block,所以你不捕捉self塊內。

+0

我可以給你買啤酒嗎? (thumbsup)在非ARC中,我使用了__block關鍵字來防止'self'在塊內被捕獲。在ARC中工作'__weak'。 – tGilani

+1

爲了完整起見,在ARC中,但針對iOS 5之前的版本,您可以使用'__unsafe_unretained' – newacct