1

私はGCDを学ぼうとしているので、GCDがどのように機能するかをまだ完全には理解していません。何らかの理由で、次のメソッドを呼び出した後、フレームレートが永続的に低下します。ディスパッチ関数を使用せず、メインループにデータを書き込むだけの場合、フレームレートは60のままです。理由はわかりません。

-(void)saveDataFile {


        _hud = [MBProgressHUD showHUDAddedTo:self.parentView animated:YES];
        _hud.labelText = NSLocalizedString(@"Saving data...", nil);


        dispatch_queue_t myQueue = dispatch_queue_create("myQueueName", NULL);


        dispatch_async(myQueue, ^(void) {

            @autoreleasepool {

                id data = [self.model getData];
                if (data != nil) {

                    NSString *filePath = @"myPath";
                    [data writeToFile:filePath atomically:YES];
                }

            }


            dispatch_async(dispatch_get_main_queue(), ^(void) {

                [_hud hide:YES];

            });

        });


    }
4

1 に答える 1

1

解決しました。私はこの質問からHUDの実装に従いました:MBProgressHUDが表示されない

基本的に、HUDを単に非表示にするのではなく、削除する必要があります。そうしないと、HUDアニメーションが継続し、私には見えなくなり、フレームレートが低下します。

-(void)saveDataFile {


// create HUD and add to view
    MBProgressHUD *hud = [[MBProgressHUD alloc]initWithView:self.parentView];
    hud.labelText = NSLocalizedString(@"Saving data...", nil);
    hud.delegate = self;
    [self.parentView addSubview:hud];


// define block for saving data

        void (^saveData)() = ^() {

            @autoreleasepool {

                id data = [self.model getData];
                if (data != nil) {

                    NSString *filePath = @"myPath";
                    [data writeToFile:filePath atomically:YES];
                }

            }

}


// use HUD convenience method to run block on a background thread
[hud showAnimated:YES whileExecutingBlock:saveData];


    }


// remove hud when done!
//
- (void)hudWasHidden:(MBProgressHUD *)hud {

    [hud removeFromSuperview];
}
于 2013-01-06T16:56:52.973 に答える