2015-06-06 19 views
0

我试图将一个大的本地文件拆分成单独的NSData部分,然后使用AFNetworking 2上传每个文件部分。所有上传成功后,每个文件部分的数据仍在内存中。如何在每次完成部件上传后释放记忆?我错过了什么?AFURLSessionManager数据上传后的空闲内存

下面是代码:

-(void) uploadRequestWithPart:(FilePart*) part{ 
    // setup request 
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:part.uploadURL]; 
    [request setHTTPMethod:@"PUT"]; 
    [request setValue:part.fileType forHTTPHeaderField:@"Content-Type"]; 
    [request setValue:@"private" forHTTPHeaderField:@"x-amz-acl"]; 

    if(!sessionManager) sessionManager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]]; 
    NSProgress *progress = nil; 

    // create Data from file part 
    FILE *file = fopen([part.fileURL.path UTF8String], "rb"); 
    if(file == NULL) return; 
    void *data = malloc(part.size); 
    fseeko(file, part.offset, SEEK_SET); 
    fread(data, 1, part.size, file); 
    fclose(file); 

    NSURLSessionUploadTask *upTask; 
    upTask = [sessionManager uploadTaskWithRequest:request fromData:[NSData dataWithBytesNoCopy:data length:part.size] progress:&progress completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) { 
     if (error){ 
      NSLog(@"%@",error.localizedDescription); 
      [upTask cancel]; // <- does cancelling this task release the NSData?? 
      upTask = nil; 
     } else{ 
      NSLog(@"Upload complete"); 
      [upTask cancel]; // <- does cancelling this task release the NSData?? 
      upTask = nil; 
     } 
     [progress removeObserver:self forKeyPath:@"partCompleted" context:nil]; 
    }]; 
    // setup upload progress 
    [progress setUserInfoObject:part forKey:@"part"]; 
    [progress addObserver:self forKeyPath:@"partCompleted" options:NSKeyValueObservingOptionNew context:nil]; 

    // start upload 
    [upTask resume]; 
} 

谢谢,托马斯

回答

0

dataBytesNoCopy:长度:创建围绕文件部分缓冲器的NSData包装。生成的NSData对象负责释放数据缓冲区。由于有多种方法来从文件中获得的字节块我想这(这为我的作品):

... 
NSData *fileData = [NSData dataWithContentsOfFile:part.fileURL.path options:NSDataReadingMappedIfSafe error:nil]; 
NSData *partData = [fileData subdataWithRange:NSMakeRange(part.offset, part.size)]; 
NSURLSessionUploadTask *upTask; 
upTask = [sessionManager uploadTaskWithRequest:request fromData:partData progress:&progress completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) {... 

这样ARC大约需要释放的字节数据的照顾。我希望这可以帮助别人。