我创建了一个名为NSOperation
的{{1}}的子类。我将所有对象逐个添加到DownloadQueue
NSOperationQueue
。
问题是当appDelegate.queueDownload
的对象被执行时,只要DownloadOperation
download
方法执行,DownloadOperation
的对象就会从队列中删除。
但我必须将其保留在内存中,因为当我在DownloadOperation
中进行异步调用[使用downloadFromPath
]并且服务器使用文件数据进行响应时,那时DownloadOperation.m
对象是已发布且DownloadOperation
从未调用过。
可能我认为这个问题有点复杂,所以在标记之前请阅读两次!!这对我来说非常重要。感谢您的理解。
liveOperationSucceeded
DownloadOperation.m(
// Adding to queue DownloadOperation *operation = [[DownloadOperation alloc] init]; operation.delegate = self; [operation operationWithFileOrFolderID:dictDocument[@"id"] withParentPath:self.strParentPath download:NO withFileName:dictDocument[@"name"] withDictionary:dictDocument]; [operation download]; [operation setQueuePriority:NSOperationQueuePriorityVeryHigh]; [appDelegate.queueDownload addOperation:operation];
的子类)
NSOperation
答案 0 :(得分:2)
您在操作中有异步操作。
操作队列正在完成它应该做的事情,并在方法DownloadOperation
完成后弹出已完成的download
。它并不关心操作是否有回调。
您需要保留DownloadOperation
操作的所有权,方法是将其添加到强引用的集合(例如NSArray
或NSSet
),并在LiveConnectClient
完成后稍后将其丢弃。您可能希望将{BOOL属性添加到DownloadOperation
来说明。
@property BOOL imReallyReallyFinishedAndCanBeDiscardedOK;
修改强>
API是基于异步/委托的。一种简单的方法是迭代文件夹内容并计算返回响应。收到与您知道已完成的请求数相匹配的回复数后。
作为一个非常简化的版本,不关心递归或错误。
@interface DownloadManager : NSObject
@property NSArray *fileRefList;
@property NSUInteger count;
@property (strong) void (^completionBlock)();
@end
@implementation DownloadManager
-(void)downloadAllTheFiles {
self.count = 0;
for(NSString *strID in self.fileRefList) {
LiveConnectClient *liveClient = [[LiveConnectClient alloc] initWithClientId:CLIENT_ID delegate:self];
[liveClient downloadFromPath:[strID stringByAppendingString:@"/content"] delegate:self];
}
}
- (void) liveOperationSucceeded:(LiveOperation *)operation
{
self.count++;
[self haveIFinished];
}
- (void) liveOperationFailed:(NSError *)error
operation:(LiveOperation *)operation
{
self.count++;
[self haveIFinished];
}
-(void)haveIFinished {
if (self.count == self.fileRefList.count) {
if (self.completionBlock) {
self.completionBlock();
}
}
}
让API为您执行队列操作和后台处理。完成时触发任意块。
答案 1 :(得分:0)
请勿在方法
中分配 * DownloadOperation 操作*将其设为.h文件中的属性,如
@property(非原子,强)DownloadOperation *操作;