在执行

时间:2017-04-21 14:36:23

标签: ios objective-c nsoperation nsoperationqueue nsblockoperation

我正在学习NSOperations& NSOperationQueue

我有一套NSBlockOperation:" UPLOAD " &安培; " DELETE &#34 ;.删除 必须 等待上传完成后再执行。

我想要发生的是在进入下一组之前完成一个操作集。

我使用NSThread sleepForTimeInterval来模拟上传等待和删除延迟时间。

然而,操作并没有等待设置完成。

我将maxConcurrentOperationCount设置为1,但这似乎无效。

您可以从输出中看到Set 1已经完成。

但是在 删除2 完成之前,第二组 上传3 盯着看。然后上传/删除4就可以了。然后从那里开始混淆了很多。

有任何帮助吗?

输出:

Start UPLOAD 1
Completed UPLOAD 1
Start DELETE 1
Completed DELETE 1

Start UPLOAD 2
Completed UPLOAD 2
Start DELETE 2
Start UPLOAD 3
Completed DELETE 2
Start DELETE 3
Completed UPLOAD 3
Completed DELETE 3

Start UPLOAD 4
Start DELETE 4
Completed UPLOAD 4
Completed DELETE 4

Start UPLOAD 5
Start DELETE 5
Completed UPLOAD 5
Start UPLOAD 6
Completed DELETE 5
Start DELETE 6
Completed UPLOAD 6
Start UPLOAD 7
Completed DELETE 6

CODE:

- (void)viewDidLoad {
    [super viewDidLoad];


    NSOperationQueue *operationQueue = [NSOperationQueue mainQueue];
    operationQueue.maxConcurrentOperationCount = 1;


//pretend there are 100 images that need to be uploaded and information in a SQLite DB waiting to be deleted upon successful upload of the image.

//Upload 1 image at a time, upon successful upload, delete the respective DB info then move to the next image 
    for (__block int i = 1; i < 100; i++){
        NSOperation * UPLOAD = [self createNewOperationWithInt:i Message:@"UPLOAD"];
        NSOperation * DELETE = [self createNewOperationWithInt:i Message:@"DELETE"];
        [DELETE addDependency:UPLOAD];
        [operationQueue addOperation:UPLOAD];
        [operationQueue addOperation:DELETE];

    }

}

- (NSBlockOperation *) createNewOperationWithInt:(int)i Message:(NSString*)message {
    NSBlockOperation * operation = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"Start %@ %i",message , i);

        if ([message containsString:@"UPLOAD"]) {
             [NSThread sleepForTimeInterval:1]; //Pretend there is Network latency on upload
        }

        if ([message containsString:@"DELETE"]) {
            [NSThread sleepForTimeInterval:0.5]; //Pretend the SQLDB is being accessed
        }

    }];
    operation.queuePriority = NSOperationQueuePriorityNormal;
    operation.qualityOfService  = NSOperationQualityOfServiceUtility;
    operation.completionBlock = ^{
       NSLog(@"Completed %@ %i",message , i);
    };

    return operation;
}

1 个答案:

答案 0 :(得分:3)

这种行为似乎很好。 “问题”是完成上载任务后,完成块和依赖关系都会运行。这就是为什么你有时会在“完成UPLOAD N”之前得到“Start DELETE N + 1”。

尝试在块操作结束时添加消息,以检查它是否在开始下一个操作之前完成:

NSBlockOperation * operation = [NSBlockOperation blockOperationWithBlock:^{
    NSLog(@"Start %@ %i",message , i);

    if ([message containsString:@"UPLOAD"]) {
         [NSThread sleepForTimeInterval:1]; //Pretend there is Network latency on upload
    }

    if ([message containsString:@"DELETE"]) {
        [NSThread sleepForTimeInterval:0.5]; //Pretend the SQLDB is being accessed
    }

    NSLog(@"Finished %@ %i",message , i);
}];