gpt4 book ai didi

iOS 多线程问题

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:16:15 24 4
gpt4 key购买 nike

我是 iOS 开发的新手,我正面临多线程问题。

我正在使用 KTPhotobrowserSDWebImage 创建照片和视频库。我必须在每张图片上加载一些外部数据,我不想影响画廊 ScrollView 的流畅度。

所以,我正在尝试使用 NSOperationNSOperationQueue 来做到这一点,但我不确定我做的是否正确。

我想要的是在用户没有停留在图片上并继续滚动时停止加载过程。

我当前的代码:

//setCurrentIndex is called when the scrollView is scrolled

- (void)setCurrentIndex:(NSInteger)newIndex {

[loadingQueue_cancelAllOperations];
currentIndex_ = newIndex;
[self loadPhoto:currentIndex_];
NSInvocationOperation *InvocationOp = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(loadInfosAtIndex:) object:newIndex];

[loadingQueue_ addOperation:InvocationOp];
[InvocationOp release];

[selfloadPhoto:currentIndex_ + 1];
[selfloadPhoto:currentIndex_ - 1];
[selfunloadPhoto:currentIndex_ + 2];
[selfunloadPhoto:currentIndex_ - 2];
}

-(void) loadInfosAtIndex:(NSInteger)index {

if (index < 0 || index >= photoCount_) {
return;
}

KTPhotoView* photoView = [photoViews_ objectAtIndex:index];
if([photoView infosAlreadyLoaded]){
NSLog(@"%d Already Loaded", index);
return;
}

//Get the extra information by calling a web service
photoView.infosAlreadyLoaded = YES;
}

我认为这不是执行此操作的正确方法...有没有人有任何建议?

最佳答案

与其依赖基于调度的取消,这会让您处于不确定状态,不如使用具有原子访问权限的取消实例变量(通过原子属性或带有互斥锁的 BOOL ivar)。

然后,您只需将取消标志设置为 YES 并定期在 loadInfosAtIndex 中检查它,而不是 [loadingQueue_cancelAllOperations]。这本质上是轮询取消,如果涉及代码,可能会很痛苦。但它的优点是让您能够通过读取标志优雅地处理取消。作为处理的一部分,您可以将 isRunning 标志(也需要原子/互斥)设置为 NO 并通过返回退出线程。

在主线程中,设置取消标志为YES后,可以等到isRunning标志为NO后再开启新线程。

关于iOS 多线程问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14703641/

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