2

アプリケーションにzipファイルといくつかの映画をダウンロードしてもらいたい。アプリを続行する前に、すべての準備が整うのを待ちたいです。これまでのコードは次のとおりです。問題は、zipファイルがダウンロードされて解凍されるとすぐにアプリケーションが常に続行され、ムービーが完了するのを待たないことです。'main'操作の依存関係としてすべての映画操作を設定しましたが、それは役に立ちませんでした。私は何が欠けていますか?

// create our network engine
MKNetworkEngine* engine = [[MKNetworkEngine alloc]
                           initWithHostName:hostName customHeaderFields:nil];

// Main operation for our app download.
MKNetworkOperation *op = [engine operationWithPath:appUpdateFile];

// If we have videos, create operations for them
// We add them to an array, so we can start them later

NSMutableArray *videoOperations = [[NSMutableArray alloc] init];
if ([appVideos isEqual:@"no_videos"]) {
    NSLog(@"We have no videos");
} else {
    for(id anObject in appVideos) {
        MKNetworkOperation *opVideo = [engine operationWithPath:[anObject valueForKey:@"downloadUrl"]];
        // add this operation as a dependency to our main operation
        [op addDependency:opVideo];
        NSString *videoFilePath = [videoFolder stringByAppendingPathComponent:[anObject valueForKey:@"name"]];
        [opVideo addDownloadStream:[NSOutputStream outputStreamToFileAtPath:videoFilePath append:YES]];
        [opVideo addCompletionHandler:^(MKNetworkOperation *completedOperation) {
            NSLog(@"We downloaded video %@", [anObject valueForKey:@"name"]);
        } errorHandler:^(MKNetworkOperation *completedOperation, NSError *error) {
            NSLog(@"Error downloading video %@: %@", [anObject valueForKey:@"name"], error);
        }];
        [videoOperations addObject:opVideo];
    }
}

[op addDownloadStream:[NSOutputStream outputStreamToFileAtPath:filePath append:YES]];

[op addCompletionHandler:^(MKNetworkOperation *completedOperation) {
    ZipArchive *zipArchive = [[ZipArchive alloc] init];

    if([zipArchive UnzipOpenFile:filePath]) {
        if ([zipArchive UnzipFileTo:htmlContent overWrite:YES]) {
            //unzipped successfully
            [[NSFileManager defaultManager] removeItemAtPath:filePath error:NULL];
            NSString *htmlContentPath = [htmlContent stringByAppendingPathComponent:@"/htmlContent/html/modules/index/index.html"];
            NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
            [defaults setObject:newAppVersion forKey:@"appVersion"];
            [defaults setObject:htmlContentPath forKey:@"htmlContent"];
            [defaults synchronize];
        } else {
            NSLog(@"Failure To Unzip Archive %@", filePath);
        }
    } else  {
        NSLog(@"Failure To Open Archive %@", filePath);
    }
} errorHandler:^(MKNetworkOperation *completedOperation, NSError *error) {
    NSLog(@"%@", error);
}];

for(id opVideo in videoOperations) {
    [engine enqueueOperation: opVideo];
}
[engine enqueueOperation: op];

return op;

これを使用したいビューでは、次のようにします。

    self.updateOperation = [ApplicationDelegate.internetUpdater checkAndUpdate];

    [self.updateOperation onDownloadProgressChanged:^(double progress) {
        pb.progress = progress;
    }];

    [self.updateOperation addCompletionHandler:^(MKNetworkOperation *completedOperation) {
        bottomLabel.text = @"Done";
        [UIView animateWithDuration:0.6
                              delay: 1.0
                            options: UIViewAnimationOptionCurveEaseIn
                         animations:^{
                             v.alpha = 0;
                         }
                         completion:^(BOOL finished){
                             [parentV removeFromSuperview];
                         }
         ];

        [self.delegate loginViewControllerDidFinish:self];
        [self dismissModalViewControllerAnimated:YES];
    } errorHandler:^(MKNetworkOperation *completedOperation, NSError *error) {
        NSLog(@"%@", error);
    }];

映画がまだダウンロード中の場合でも、常にこの完了ブロックが実行されます。これが期待どおりに機能しない理由についてのヒントはありますか?または、依存関係を間違って解釈しますか?

4

0 に答える 0