我有一个音频文件,当用户滚动UIScrollView时需要淡出.但是,performSelector:withObject:afterDelay:在用户停止滚动之前,任何方法都会被阻止.所以我试图创建一些代码来在另一个线程上执行淡出:
- (void)fadeOut
{
[NSThread detachNewThreadSelector:@selector(fadeOutInBackground:) toTarget:self withObject:self.audioPlayer];
}
- (void)fadeOutInBackground:(AVAudioPlayer *)aPlayer
{
NSAutoreleasePool *myPool = [[NSAutoreleasePool alloc] init];
[self performSelector:@selector(fadeVolumeDown:) withObject:aPlayer afterDelay:0.1];
[myPool release];
}
- (void)fadeVolumeDown:(AVAudioPlayer *)aPlayer
{
aPlayer.volume = aPlayer.volume - 0.1;
if (aPlayer.volume < 0.1) {
[aPlayer stop];
} else {
[self performSelector:@selector(fadeVolumeDown:) withObject:aPlayer afterDelay:0.1];
}
}
Run Code Online (Sandbox Code Playgroud)
它得到了performSelector,但没有进一步,因为我猜它试图在一个它无法访问的线程上执行.我甚至无法改变它,performSelector:onThread:withObject:waitUntilDone:因为没有延迟选项.
有任何想法吗?他们为什么要这么难以淡出声音呢?呻吟
谢谢!
目标是"在viewWillAppear开始时启动一个微调器图形,在显示tableview之前加载数据",这样用户就不会想知道为什么在看到表之前会有延迟.即UIActivityIndicatorView已被添加到窗口中,我只想设置alpha来隐藏/显示它.
在启动一个线程以确保显示"旋转齿轮"imageview(tag = 333)之前,我得到了这个奇怪的错误,然后继续加载/计算viewWillAppear中的东西.
我不会在每次调用[appdel addGearz]和[appdel removeGearz]时都知道它,这两种情况都会发生,而且它是随机的.它可能发生在2个viewWillAppears之后,或15之后.如果我注释掉设置alpha的行,一切正常.
一个典型的viewWillAppear看起来像这样,
[super viewWillappear];
self.title=@"Products listing"; //and other simple things
[appdel addGearz];
[self getProducts];
[self getThumbnails];
[myTableView reloadData]; //in case view already loaded and coming back from subview and data changed
Run Code Online (Sandbox Code Playgroud)
如果带有.alpha的行未被注释掉,那么代码就会崩溃
-(void)addGearz {
[NSThread detachNewThreadSelector:@selector(gearzOn) toTarget:self withObject:nil];
}
-(void)removeGearz {
[NSThread detachNewThreadSelector:@selector(gearzOff) toTarget:self withObject:nil];
}
- (void)gearzOn {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
[window viewWithTag:333].alpha=1.0;
//
// [[window viewWithTag:333] setNeedsDisplay];
[pool drain];
}
- (void) gearzOff {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] …Run Code Online (Sandbox Code Playgroud) 我试图在4.3.5中使用NSThreads和ARC.使用iOS 5,一切都很完美,但如果我在较旧的iOS上尝试它,如4.3它的泄漏.通常我会为NSThreads使用Autoreleasepool,但由于ARC中没有手动Autoreleasepool我不知道如何解决这个问题.
我收到了大量的消息,比如"__NSAutoreleaseNoPool():类NSComparisonPredicate的对象0x4567b40自动释放,没有池到位 - 在我启动一个线程后在我的控制台中泄漏".
NSThread detachNewThreadSelector:@selector(showAlert) toTarget:self withObject:nil];
Run Code Online (Sandbox Code Playgroud)
如何在5.0之前正确地与ARC和iOS进行交互.
干杯网
iphone objective-c nsthread nsautoreleasepool automatic-ref-counting
有没有人想要使用原始NSThread而不是GCD进行并发?我喜欢GCD,但我想知道我是否需要最终使用NSThreads进行Cocoa/Cocoa-Touch.
cocoa cocoa-touch objective-c nsthread grand-central-dispatch
我正面临着我的应用程序的设计问题.
基本上,以下是我在我的应用程序中要做的事情.
单个任务是这样的:
可能会同时执行许多任务.
一个任务中的步骤显然是ordered(即,没有第2步下载json,第3步不能继续),但它们也可以discrete.我的意思是,例如,task2的第4步可以在task1的第3步之前执行(如果task2的下载速度比task1的更快)
任务有优先事项.用户可以启动具有更高优先级的任务,因此将尝试在所有其他任务之前执行所有任务的步骤.
我希望UI能够尽可能地响应.
所以我打算创建一个优先级最低的NSThread.
我在该线程中放置了一个自定义优先级事件队列.任务的每一步都成为一个事件(工作单位).因此,例如,下载json的步骤1成为事件.下载后,该事件会为步骤3生成另一个事件并将其放入队列中.每个事件都有自己的优先级设置.
现在我看到这篇文章:并发和应用程序设计.Apple建议我们Move Away from Threads使用GCD或NSOperation.
我发现这NSOperation与我的草稿设计相匹配.但我有以下问题:
谢谢
我有:
似乎NSMenu默认视图在执行动画时会阻塞主线程.我已经通过辅助线程输出time_since_last_loop与视图的drawRect:(主线程)进行了测试,只有drawRect显示了断断续续.自定义视图的drawRect从~30 fps下降到5帧几帧.
有没有NSMenu动画非阻塞,或与自定义视图的drawRect并发的方法?
我遇到了这个_cmd伎俩:
-(void)methodToBeRunOnMainThreadWithObj:(id)object {
if (![NSThread isMainThread) {
[self performSelectorOnMainThread:_cmd withObject:object]
} else {
// ... method body
}
}
Run Code Online (Sandbox Code Playgroud)
这是确保在主线程上执行方法的可靠方法吗?
在我的一个视图中,我需要动画UIImageView的框架属性,并在执行此操作时,我想在导航栏的标题视图中显示进度条(UIProgressView).问题是如果我注释掉以下动画阻止进度条按预期顺利更新.另一方面,由于以下动画,进度条在几个位置停止并再次递增.
//add message bubble
[UIView animateWithDuration:0.3
delay:0
options:UIViewAnimationOptionAllowUserInteraction
animations:^
{
animationBubbleImageView.alpha = 1;
}
completion:^(BOOL finished)
{
[self removeAutoCorrectionAndHighlight];
[UIView animateWithDuration:0.3
delay:0
options:UIViewAnimationOptionAllowUserInteraction
animations:^
{
CGRect bubbleFrame = CGRectMake(animationBubbleImageView.frame.origin.x,
animationBubbleImageView.frame.origin.y,
bubbleSize.width,
bubbleSize.height);
[animationBubbleImageView setFrame:bubbleFrame];
messageLabel.alpha = 1;
}
completion:^(BOOL finished)
{
[self sendSubviewToBack:textView];
[self.delegate moveBubbleToTableCell];
}];
}];
Run Code Online (Sandbox Code Playgroud)
动画块不会阻止主线程,但是什么因为进展视图不顺畅的原因?
更新:我想要实现的是IOS中的MessagesApp气泡动画.当键入的消息变成气泡并飞到它的位置时,进度条应该缓慢增加.
如果我尝试相同的事情,你的动画进度条增量正常.
iOS上的操作顺序是什么?
我正在考虑时间问题
setNeedsLayout 和 layoutSubviewssetNeedsDisplay 和 drawRect[NSTimer scheduledTimerWithTimeInterval:0.000001 tar(...)]dispatch_async(dispatch_get_main_queue(), ^{ /* code */}作为我希望收到的答案的一个例子,它可以采用以下格式:
main上的dispatch_async 在下一个运行周期之前发生
drawRect 在运行周期结束时发生
我读到很多帖子NSRunLoop,像这个,这个,这个.但无法弄清楚究竟NSRunLoop做了什么
我通常看到的是一个工人线程
wthread = [[NSThread alloc] initWithTarget:self selector:@selector(threadProc) object:nil];
[wthread start];
Run Code Online (Sandbox Code Playgroud)
里面有一个NSRunLoop
- (void)threadProc
{
NSAutoreleasePool* pool1 = [[NSAutoreleasePool alloc] init];
BOOL isStopped = NO;
NSRunLoop *runloop = [NSRunLoop currentRunLoop];
[runloop addPort:[NSMachPort port] forMode:NSDefaultRunLoopMode];
while (!isStopped)
{
{
NSAutoreleasePool* pool2 = [[NSAutoreleasePool alloc] init];
[runloop runMode:NSDefaultRunLoopMode
beforeDate:[NSDate distantFuture]];
[pool2 release];
}
}
[pool1 release];
}
Run Code Online (Sandbox Code Playgroud)
主线程将一些工作传递给了这个wthread
[self performSelector:@selector(someWork:) onThread:wthread withObject:nil waitUntilDone:NO];
Run Code Online (Sandbox Code Playgroud)
在将工作从主线程传递到工作线程方面,我看到很多人这样做.为什么需要NSRunLoop?它有什么作用 ?
我读了NSRunLoop用于管理事件,为什么会出现什么叫除外runMode里面threadProc?
nsthread ×10
ios ×5
objective-c ×5
iphone ×4
cocoa ×2
nsrunloop ×2
calayer ×1
cocoa-touch ×1
enumeration ×1
foundation ×1
ipad ×1
nonblocking ×1
nsmenu ×1
nsoperation ×1
nsview ×1
port ×1