gpt4 book ai didi

iphone - NSThread detachNewThreadSelector 锁定主线程

转载 作者:行者123 更新时间:2023-11-28 19:23:40 25 4
gpt4 key购买 nike

我正在努力每 60 秒在后台执行一些任务。后台任务是服务器请求从网站下载文件。当请求完成并且我正在将数据保存到 sqlite 时,主线程/UI 似乎正在锁定。

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
[NSThread detachNewThreadSelector:@selector(startTheBackgroundSync) toTarget:self withObject:nil];
[pool release];

- (void)startTheBackgroundSync {

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

// [self performSelectorInBackground:@selector(moveSynctoBack) withObject:nil];
// [self performSelectorOnMainThread:@selector(makeMyProgressBarMoving) withObject:nil waitUntilDone:NO];

serverSync = [[[ServerSync alloc]init]autorelease];
while (1==1) {
serverSync.delegate = self;
[serverSync syncNow:nil];
[NSThread sleepForTimeInterval:120];
}
[pool release];
[serverSync release];

}

虽然循环不会锁定主线程,但当 ASIHTTPRequest 处理完数据后,它会锁定 ui 一秒钟。

最佳答案

ASIHTTPRequest 的完成选择器将始终在主线程上执行。因此,您不应该在那里执行长时间运行的任务。

您可以安排一个重复的 NSTimer,而不是启动一个新线程:

NSTimer* timer = [NSTimer scheduledTimerWithTimeInterval:120 target:self selector:@selector(backgroundSync) userInfo:nil repeats:YES];

...使用以下操作方法:

-(void) backgroundSync
{
ServerSync* serverSync = [[[ServerSync alloc]init]autorelease];
serverSync.delegate = self;
[serverSync syncNow:nil];
}

请确保您使用ServerSync 中的startAsynchronous 方法来启动请求!

此外,我建议实现一个单例,然后像这样使用它:

-(void)init {
[[ServerSync sharedSync] setDelegate:self];
}

-(void) backgroundSync
{
[[ServerSync sharedSync] syncNow];
}

关于iphone - NSThread detachNewThreadSelector 锁定主线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6322209/

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