我在我的项目中使用AFNetworking
。我需要弄清楚的主要事情是如何在远程服务器上加载到iOS设备上的Document目录中检测所有文件的时刻。
现在我有这个架构:
这个方法有循环,它调用下载新的Zip文件方法。请查看循环结束后它将立即调用的-stopLoad
方法。原因如下:
- (void)startLoad {
for (NSDictionary *item in items) {
if ([self checkIfNeedUpdateQZTestModelWithItem:item]) {
NSString *urlString = [item objectForKey:@"url"];
NSNumber *updateID = [item objectForKey:@"update_id"];
[self downloadZipFileWithUrlString:urlString andUpdateID:updateID];
}
}
[self stopLoad];
}
- (void)downloadZipFileWithUrlString:(NSString *)urlString andUpdateID:(NSNumber *)updateId
{
NetworkManagerBlock block = ^ {
NSString *fileName = [self fileNameFromUrlString:urlString];
FileManager *fileManager = [FileManager new];
[fileManager unZipFileWithFileName:fileName andUpdateID:updateId];
};
[self downloadFileWithUrlString:urlString withCompletionBlock:block];
}
- (void)downloadFileWithUrlString:(NSString *)urlString withCompletionBlock:(NetworkManagerBlock)block
{
NSURL *url = [NSURL URLWithString:urlString];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *fileName = [self fileNameFromUrlString:urlString];
NSString *path = [[paths objectAtIndex:0] stringByAppendingPathComponent:fileName];
operation.outputStream = [NSOutputStream outputStreamToFileAtPath:path append:NO];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
block();
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Error: %@", error);
}];
[operation start];
}
-stopLoad
立即调用的原因是我假设的异步操作。因此,如果我需要下载10或20个文件,我不知道何时下载最后一个文件。所以在我的情况下,-stopLoad
方法并没有告诉我它在结束周期后刚刚调用的完整所有操作。
我想我需要一些操作堆栈或类似的东西来弄清楚加载所有文件的时间。我对吗?但我仍然在考虑正确的解决方案。有任何想法吗?感谢。
我还添加了NSInteger
变量operationsCount
。我在每个operationsCount
块中减少setCompletionBlockWithSuccess
,然后检查变量值是否等于-1然后我调用-stopLoad
并且它可以工作,但我不认为这是一个很好的解决方案。
答案 0 :(得分:2)
为什么不让您的服务器提供一些有关下载量的信息?它可以是一个简单的API调用,如
http://yoursever.com/fileList?user=johnDoe&filter=important
给你类似的东西
{
"status": "OK",
"fileList": ["file1", "file2", "file3"]
}
现在,您可以遍历文件并在完成后调用stopLoad
例程。
答案 1 :(得分:1)
stopLoad
被称为同步,而所有请求都试图异步加载 。如果该方法听起来像是这样,那么您的请求将在启动后立即取消。
要获得一批请求操作完成时的处理程序,请使用HTTPClient -enqueueBatchOfHTTPRequestOperationsWithRequests:progressBlock:completionBlock:
。