0

iOSでは、同じメソッドを何度も呼び出す必要がありますが、アプリはメソッドが最初のタスクを完了するまで待機する必要があります。(bool値を使用して関数が実行されているかどうかを確認することはできません)。

リクエストをキューに入れたり、前のタスクが終了するまで待つにはどうすればよいですか?NSOperationまたはNSThreadを使用する方法はありますか?

ありがとう

これは私が複数回呼び出す必要がある私のメソッドです

- (void)fetchJobs
{

    dispatch_queue_t queueLocal = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_group_t groupLocal = dispatch_group_create();

    UIApplication *app = [UIApplication sharedApplication];

    NSTimeInterval backgroundTime = app.backgroundTimeRemaining;
    NSLog(@"Background task remain time: %g seconds", (double)backgroundTime);


    [[NSNotificationCenter defaultCenter] postNotificationName:@"UPLOAD_PROCESS_START" object:nil];

    self.assetUpdateTaskID = [app beginBackgroundTaskWithExpirationHandler:^{
        dispatch_async(dispatch_get_main_queue(), ^{

            [self endTask];
        }); 
    }];

    dispatch_group_async(groupLocal, queueLocal, ^{

        NSEntityDescription *entity = [NSEntityDescription entityForName:@"Files" inManagedObjectContext:self.managedObjectContext];

        //Setup the fetch request
        NSFetchRequest *request = [[NSFetchRequest alloc] init];
        [request setEntity:entity];

        NSPredicate *predicate = [NSPredicate predicateWithFormat: @"uploaded like %@", [NSString stringWithFormat:@"0"]];
        [request setPredicate:predicate];

        NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"timeStamp" ascending:YES];
        [request setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]];

        NSError *error = nil;

        //fetch the records and handle an error
        NSArray *fetchResults = [self.managedObjectContext executeFetchRequest:request error:&error];


        if (fetchResults == nil) {
            NSLog(@"File Data fetching error : %@", [error localizedDescription]);
        }
        else{
            if ([fetchResults count] > 0) {            

                dispatch_apply([fetchResults count], queue, ^(size_t i){
                    NSLog(@"Loop count %zu", i);

                    Files *file = [fetchResults objectAtIndex:i]; 
                    self.manageObjectForFiles = file;
                    NSLog(@"Fetched File details -> Name: %@ & status: %@" , file.fileName, file.uploaded);                    

                    BOOL uploaded = [self filePosting:file.fileName];


                    if (uploaded) {

                        [self.managedObjectContext deleteObject:file];
                        NSError *error;

                        if (![self.managedObjectContext save:&error]) {
                            NSLog(@"File table update error : %@", [error description]);
                        }
                    }                     

                });
                /*
                for (int i = 0; i < [fetchResults count]; i++) {                    

                }*/
            }            
        }

        dispatch_async(dispatch_get_main_queue(), ^{

            [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;

            int remainJobs = [self fetchFileTableCount];
            if (remainJobs > 0) {

                [UIApplication sharedApplication].applicationIconBadgeNumber = remainJobs;
                [[NSNotificationCenter defaultCenter] postNotificationName:@"UPLOAD_REMAIN" object:nil];
            }
            else{
                [UIApplication sharedApplication].applicationIconBadgeNumber = 0;
                [[NSNotificationCenter defaultCenter] postNotificationName:@"UPLOAD_PROCESS_COMPLETED" object:nil];
                NSLog(@"-----------------------------------------------");
                NSLog(@"There are no more uploads");
                NSLog(@"-----------------------------------------------");
            }
            [self endTask];                                    

        });

    });

    dispatch_release(groupLocal);

}
4

1 に答える 1

1

呼び出しを同時に実行できるかどうかの連続である必要があるかどうかは言わなかったでしょう。同時にNSOperationのmainQueueを使用できる場合は、それを一時停止し、最初の呼び出しを除くすべてを追加します。次に、メソッドで、最後に、キューが一時停止されているかどうかを確認し、一時停止されている場合は再開します。

Grand Central Dispatch(CGD)を使用すると、シリアルディスパッチキューをより簡単に作成でき、同じことを行うことができます。一時停止し、ブロックにラップされた最初の呼び出しを除くすべてを追加し、最初の呼び出しの最後にキューの一時停止を解除します。これをメインスレッドで実行する必要がある場合は、シリアルキューをメインGCDキューに関連付けることができます。

于 2012-07-17T17:47:04.640 に答える