gpt4 book ai didi

ios - 即使使用 GCD,UI 仍然延迟

转载 作者:行者123 更新时间:2023-11-28 21:59:52 25 4
gpt4 key购买 nike

在我的模态 UI 中有一个与 IBAction -done: 链接的“DONE”按钮,它会将文本上传到(比如说 Dropbox 服务器)。它的代码看起来像这样

- (IBAction)done:(id)sender {
// must contain text in textview
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
if (![_textView.text isEqualToString:@""]) {

// check to see if we are adding a new note
if (!self.note) {
DBFile *newNote = [[DBFile alloc] init];
newNote.root = @"dropbox";
self.note = newNote;
}

_note.contents = _textView.text;
_note.path = _filename.text;

// - UPLOAD FILE TO DROPBOX - //
NSLog(@"Initializing URL...");
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
NSURL *url = [Dropbox uploadURLForPath:self.note.path];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];
[request setHTTPMethod:@"PUT"];
NSData *noteContents = [self.note.contents dataUsingEncoding:NSUTF8StringEncoding];
NSLog(@"Creating session task...");
NSURLSessionUploadTask *uploadTask = [self.session uploadTaskWithRequest:request
fromData:noteContents
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
NSHTTPURLResponse *resp = (NSHTTPURLResponse *) response;
if (!error && resp.statusCode == 200) {
NSLog(@"OK");
dispatch_async(dispatch_get_main_queue(), ^{
[self.delegate noteDetailsViewControllerDoneWithDetails:self];
});
} else {
NSLog(@"Status code: %d", resp.statusCode);
}
}];
[uploadTask resume];
});
} else {
UIAlertView *noTextAlert = [[UIAlertView alloc] initWithTitle:@"No text"
message:@"Need to enter text"
delegate:nil
cancelButtonTitle:@"Ok"
otherButtonTitles:nil];
[noTextAlert show];
}

这个类的委托(delegate)方法noteDetailsViewControllerDoneWithDetails:是这样的

-(void)noteDetailsViewControllerDoneWithDetails:(NoteDetailsViewController *)controller{
// refresh to get latest
[self dismissViewControllerAnimated:YES completion:nil];
[self notesOnDropbox];}

(notesOnDropbox 是一项耗时的工作)。当点击 DONE 按钮时,我希望这个模态 VC/UI 立即关闭并在后台获取数据(通过 notesOnDropbox 方法)。但是,当我尝试点击“完成”按钮时,我的用户界面停止响应大约几秒钟,之后模态用户界面被关闭。我不知道我在哪里滥用了 GCD。请帮助我。

最佳答案

如果你想立即关闭你的模态 VC/UI,只需让代理关闭,

喜欢的是:

 - (IBAction)done:(id)sender {
[self.delegate noteDetailsViewControllerDoneWithDetails:self];
// ...
}

在您的示例代码中,

您在上传任务完成后执行关闭操作,但上传任务是异步的。

并且您要求委托(delegate)人解除使用 GCD dispatch_async,这也是异步任务。

毕竟,你要考虑什么时候上传,谁来做上传任务,什么时候调用notesOnDropbox。

关于ios - 即使使用 GCD,UI 仍然延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25397067/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com