标签: nsthread

如何在后台线程上淡出AVAudioPlayer?

我有一个音频文件,当用户滚动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:因为没有延迟选项.

有任何想法吗?他们为什么要这么难以淡出声音呢?呻吟

谢谢!

objective-c avaudioplayer nsthread ipad ios

7
推荐指数
1
解决办法
6551
查看次数

崩溃 - "集合<CALayerArray:0x645dfc0>在被枚举时发生了变异."

目标是"在viewWillAppear开始时启动一个微调器图形,在显示tableview之前加载数据",这样用户就不会想知道为什么在看到表之前会有延迟.即UIActivityIndi​​catorView已被添加到窗口中,我只想设置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)

iphone enumeration calayer nsthread nsautoreleasepool

7
推荐指数
1
解决办法
5913
查看次数

自动参考计数(ARC)中的NSThreads

我试图在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

7
推荐指数
1
解决办法
3529
查看次数

什么时候有人想要使用NSThreads而不是GCD?

有没有人想要使用原始NSThread而不是GCD进行并发?我喜欢GCD,但我想知道我是否需要最终使用NSThreads进行Cocoa/Cocoa-Touch.

cocoa cocoa-touch objective-c nsthread grand-central-dispatch

7
推荐指数
1
解决办法
470
查看次数

iphone - 我应该使用NSOperationQueue和NSOperation而不是NSThread吗?

我正面临着我的应用程序的设计问题.


基本上,以下是我在我的应用程序中要做的事情.

单个任务是这样的:

  1. 从底层CoreData数据库中读取自定义对象
  2. 从网址下载json
  3. 解析json以更新自定义对象或创建一个新对象(解析可能需要1 - 3秒,大数据)
  4. 分析自定义对象(将涉及一些计算,可能需要1 - 5秒)
  5. 将自定义对象保存到CoreData数据库中.

可能会同时执行许多任务.

一个任务中的步骤显然是ordered(即,没有第2步下载json,第3步不能继续),但它们也可以discrete.我的意思是,例如,task2的第4步可以在task1的第3步之前执行(如果task2的下载速度比task1的更快)

任务有优先事项.用户可以启动具有更高优先级的任务,因此将尝试在所有其他任务之前执行所有任务的步骤.


我希望UI能够尽可能地响应.

所以我打算创建一个优先级最低的NSThread.

我在该线程中放置了一个自定义优先级事件队列.任务的每一步都成为一个事件(工作单位).因此,例如,下载json的步骤1成为事件.下载后,该事件会为步骤3生成另一个事件并将其放入队列中.每个事件都有自己的优先级设置.


现在我看到这篇文章:并发和应用程序设计.Apple建议我们Move Away from Threads使用GCDNSOperation.

我发现这NSOperation与我的草稿设计相匹配.但我有以下问题:

  • 考虑到iPhone/iPad cpu内核,我应该只使用一个NSOperationQueue还是创建多个?
  • NSOperationQueue或NSOperation是否以最低线程优先级执行?执行是否会影响UI响应(我关心因为步骤涉及计算)?
  • 我可以从另一个生成NSOpeartion并将其放入队列吗?我在NSOperation中没有看到队列属性,我怎么知道队列?
  • 如何将NSOperationQueue与CoreData合作?每次访问CoreData时,我应该创建一个新的上下文吗?这会贵吗?
  • 任务的每一步都成为NSOperation,这个设计是否正确?

谢谢

iphone objective-c nsoperation nsthread nsoperationqueue

7
推荐指数
1
解决办法
1894
查看次数

NSMenu动画阻止主线程

我有:

  • NSStatusItem具有自定义视图(在辅助线程中滚动文本),辅助线程更新内部状态并通过setNeedsDisplay通知主线程.
  • 在mouseDown上,弹出一个NSMenu.
  • 但是,如果选择了NSMenu中的任何NSMenuItem,或者如果检测到第二个mouseDown并且NSMenu消失,则滚动文本动画会断断续续.

似乎NSMenu默认视图在执行动画时会阻塞主线程.我已经通过辅助线程输出time_since_last_loop与视图的drawRect:(主线程)进行了测试,只有drawRect显示了断断续续.自定义视图的drawRect从~30 fps下降到5帧几帧.

有没有NSMenu动画非阻塞,或与自定义视图的drawRect并发的方法?

nonblocking nsmenu nsview nsthread

7
推荐指数
1
解决办法
418
查看次数

使用_cmd在目标c中的主线程上执行方法

我遇到了这个_cmd伎俩:

-(void)methodToBeRunOnMainThreadWithObj:(id)object {
    if (![NSThread isMainThread) {
        [self performSelectorOnMainThread:_cmd withObject:object]
    } else {
        // ... method body
    }
}
Run Code Online (Sandbox Code Playgroud)

这是确保在主线程上执行方法的可靠方法吗?

cocoa objective-c foundation nsthread ios

7
推荐指数
1
解决办法
1924
查看次数

animateWithDuration:破坏平滑的进度条增量

在我的一个视图中,我需要动画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气泡动画.当键入的消息变成气泡并飞到它的位置时,进度条应该缓慢增加.

如果我尝试相同的事情,你的动画进度条增量正常.

iphone uiprogressview nsthread uiviewanimation ios

7
推荐指数
1
解决办法
743
查看次数

iOS上runloop中的操作顺序

iOS上的操作顺序是什么?

我正在考虑时间问题

  • setNeedsLayoutlayoutSubviews
  • setNeedsDisplaydrawRect
  • 触摸识别
  • [NSTimer scheduledTimerWithTimeInterval:0.000001 tar(...)]
  • dispatch_async(dispatch_get_main_queue(), ^{ /* code */}

作为我希望收到的答案的一个例子,它可以采用以下格式:

main上的dispatch_async 在下一个运行周期之前发生

drawRect 在运行周期结束时发生

nsthread grand-central-dispatch nsrunloop ios

7
推荐指数
1
解决办法
1332
查看次数

NSRunLoop做什么?

我读到很多帖子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

port nsthread nsrunloop ios

6
推荐指数
1
解决办法
7680
查看次数