длительная задержка при вызове метода какао - PullRequest
0 голосов
/ 15 мая 2011

У меня есть метод для сохранения содержимого UIScrollView с предоставленным пользователем именем файла.

Все работает нормально, за исключением того, что при нажатии пользователем кнопки «Сохранить» и метода происходит длительная задержканазывается.Я не могу понять, что вызывает задержку, и не могу найти способ указать пользователю, что все в порядке, мы не потерпели крах!

Я думал, что задержка происходила во время renderInContext, но, похоже,происходит намного раньше, когда ничего особенного не происходит.

Вот неприятный метод:

- (void)captureViewImage {

    NSLog(@"captureViewImage called!");

// long delay happens here!

    fileNamer.title = @"Preparing to save...";

    // get user's file name
    NSString *fileName = fileNamer.fileNameField.text;

    // dismiss keyboard
    [fileNamer.fileNameField resignFirstResponder];

    // dismiss modal view
    [self dismissFileNamingFormSheet];

    CGRect oldFrame = mainScrollView.frame;

    // capture off-screen content
    mainScrollView.frame = CGRectMake(0, 0, 1024, 1432);

    // make screenshot
    UIGraphicsBeginImageContext(mainScrollView.bounds.size);
    [mainScrollView.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *screenImg = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    // save screenshot in docs dir
    NSData *pngData = UIImagePNGRepresentation(screenImg);
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDir = [paths objectAtIndex:0];
    [pngData writeToFile:[documentsDir stringByAppendingPathComponent:fileName] 
                 options:NSDataWritingAtomic error:nil];

    // revert scroll view
    mainScrollView.frame = oldFrame;

}

fileNamer - это пользовательский класс, который вызывает UIModalPresentationFormSheet и просит пользователя:введите имя для файла.Это выглядит следующим образом:

@implementation FileNamingViewController

@synthesize fileNameField, newFileName;


- (id)initWithNibName:(NSString *)nibNameOrNil 
               bundle:(NSBundle *)nibBundleOrNil parent:(TestDriveViewController *) myParent {

    if (self == [super initWithNibName:@"FileNamingViewController" bundle:nil]) {
        UIBarButtonItem *rightButton = [[UIBarButtonItem alloc] 
                                        initWithTitle:@"Save" 
                                        style:UIBarButtonItemStyleDone 
                                        target:myParent 
                                        action:@selector(captureViewImage)];
        self.navigationItem.rightBarButtonItem = rightButton;
        [rightButton release];

        UIBarButtonItem *leftButton = [[UIBarButtonItem alloc] 
                                        initWithTitle:@"Cancel" 
                                        style:UIBarButtonItemStyleBordered 
                                        target:myParent 
                                        action:@selector(dismissFileNamingFormSheet)];
        self.navigationItem.leftBarButtonItem = leftButton;
        [leftButton release];

        self.title = @"Save As?";
    }
    return self;
}


// UITextFieldDelegate

- (void)textFieldDidEndEditing:(UITextField *)textField {
    [fileNameField resignFirstResponder];
}


- (void)viewDidLoad {
    [fileNameField becomeFirstResponder];
    [super viewDidLoad];
}

fileNamer инициализируется и освобождается следующим образом:

- (void)presentFileNamingFormSheet {
    fileNamer = [[FileNamingViewController alloc] 
                 initWithNibName:nil 
                 bundle:nil 
                 parent:self];

    fileNamingNavCtrl = [[UINavigationController alloc]
                        initWithRootViewController:fileNamer];

    fileNamingNavCtrl.modalPresentationStyle = UIModalPresentationFormSheet;

    [self presentModalViewController:fileNamingNavCtrl
                            animated:YES];

    // resize modal form sheet
    fileNamingNavCtrl.view.superview.frame = CGRectMake(0, 0, 540, 115);

    // reposition modal form sheet
    CGPoint position = CGPointMake(self.view.center.x, self.view.center.y - 50);
    fileNamingNavCtrl.view.superview.center = position;
}

- (void)dismissFileNamingFormSheet {
    [fileNamer release];
    [fileNamingNavCtrl release];
    [self dismissModalViewControllerAnimated:YES];  
}

Вывод из Time Profiler:

Running (Self)      Symbol Name
1109.0ms   37.0%    argb32_image_mark_rgb32
328.0ms   10.9%     blkclr
171.0ms    5.7%     lo_alltraps
134.0ms    4.4%     pmap_enter
116.0ms    3.8%     png_write_find_filter
102.0ms    3.4%     pmap_remove_range
55.0ms    1.8%      pmap_get_mapwindow
47.0ms    1.5%      vm_page_lookup
47.0ms    1.5%      ml_set_interrupts_enabled
43.0ms    1.4%      vm_page_grab
38.0ms    1.2%      OSAddAtomic64
34.0ms    1.1%      hw_lock_to
31.0ms    1.0%      alphaProviderGetBytes
30.0ms    1.0%      hw_lock_unlock
26.0ms    0.8%      png_read_filter_row
25.0ms    0.8%      deflateInit_
23.0ms    0.7%      vm_map_lookup_entry
23.0ms    0.7%      adler32
22.0ms    0.7%      memory_object_recover_named

1 Ответ

0 голосов
/ 03 ноября 2011

Я выяснил, что вызвало это.Изображение, которое я сохранял, содержало много прозрачных представлений.Например, у меня было много UIB-кнопок с альфа-значением 0,05, чтобы они более или менее исчезли.Я не понимал, что могу просто установить тип кнопки на пользовательский, чтобы сделать его невидимым (я создал представление давно).После того, как я установил все в моем изображении на альфа-значение 1,0, процесс сохранения стал намного быстрее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...