NSOperationQueue中的类对象 - 使用委托的异步方法

时间:2014-08-26 07:37:10

标签: ios objective-c nsoperation nsoperationqueue onedrive

我创建了一个名为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

2 个答案:

答案 0 :(得分:2)

您在操作中有异步操作。

操作队列正在完成它应该做的事情,并在方法DownloadOperation完成后弹出已完成的download。它并不关心操作是否有回调。

您需要保留DownloadOperation操作的所有权,方法是将其添加到强引用的集合(例如NSArrayNSSet),并在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 *操作;