标签: nsthread

“[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distanceFuture]]”有什么作用?

我对 NSRunLoop 有一些问题。当运行如下代码时,主线程似乎停止了,并且在 while 循环之后不会运行代码。我想知道 [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distanceFuture]] 执行时,主线程的运行循环中会发生什么?我们知道UI主线程的runloop在应用程序启动时自动运行,主线程是休眠还是处于死循环?

while (!self.runLoopThreadDidFinishFlag) {
    NSLog(@"Begin RunLoop");

    [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];

    NSLog(@"End RunLoop");
}
Run Code Online (Sandbox Code Playgroud)

multithreading objective-c nsthread nsrunloop

5
推荐指数
1
解决办法
6134
查看次数

用类方法NSThread?

是否可以在单独的线程中运行类方法(以'+'开头)?通常我会像[myClass myController];我尝试的那样调用方法[NSThread detachNewThreadSelector:myController toTarget:myClass withObject:nil];但没有成功.

cocoa nsthread

4
推荐指数
1
解决办法
1049
查看次数

每个线程都需要自己的自动释放池吗?

每个线程都必须有自己的池吗?我正在写一个使用线程的iPhone应用程序.如果我没有在一个线程上放一个池,它就会抱怨漏水.

我想要做的是存储一些比线程更长的对象.我该怎么做?

iphone cocoa cocoa-touch nsthread

4
推荐指数
1
解决办法
1958
查看次数

检测performSelectorInBackground的结束:withObject:

我的iOS应用程序中有异步服务器请求:

[self performSelectorInBackground:@selector(doSomething) withObject:nil];
Run Code Online (Sandbox Code Playgroud)

如何检测此操作的结束?

iphone multithreading detect nsthread ios

4
推荐指数
1
解决办法
4505
查看次数

iOS线程等待操作

我有一个处理线程,我用它来填充数据缓冲区.在其他地方,一块硬件触发从该数据缓冲区读取的回调.然后处理线程启动并重新填充缓冲区.

当缓冲区填满时,我正在告诉线程等待:

while( [self FreeWriteSpace] < mProcessBufferSize && InActive) {
    [NSThread sleepForTimeInterval:.0001];
}
Run Code Online (Sandbox Code Playgroud)

但是当我描述我在睡眠中花费了大量的CPU时间.还有更好的等待方式吗?我是否甚至关心配置文件是否说时间花在睡眠中?

iphone objective-c nsthread ios

4
推荐指数
1
解决办法
1万
查看次数

Sleep和NSRunLoop之间的区别runMode:beforeDate:

我最近发现,当等待我的NSURLConnections通过它时,如果我告诉等待线程做的话,效果会好得多:

[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];

代替

[NSThread sleepForTimeInterval:1];

在阅读了一些关于NSRunLoop runMode:beforeDate之后:听起来它总是优于睡眠.有人发现这是真的吗?

iphone objective-c nsthread ios

4
推荐指数
1
解决办法
4345
查看次数

睡眠或暂停NSThread

我正在创建一个新的Thread,它会在每一段时间后运行我的一个方法.

现在我正在做的如下:

NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(setUpTimerThread) object:nil];
 [thread start];
Run Code Online (Sandbox Code Playgroud)

上面的方法调用我的setUpTimerThraed方法,这个方法生成一个NSTimer并在每1分钟后调用一个特定的方法,即syncData.现在我想要的是我的同步数据方法是将一些文件发送到FTP文件夹.什么时候它发送一个文件到FTP我想让我的"线程"睡一会儿.

我用过

[NSThread sleepForTimeInterval:3.0];
Run Code Online (Sandbox Code Playgroud)

但是这段代码阻止了我的应用主线程.有什么方法我只能睡一段时间我的"线程"线程,以便它不会停止我的应用程序响应3秒,并没有睡觉我的主线程.希望你得到我要问的人.请帮忙?

nsthread ipad

4
推荐指数
1
解决办法
6079
查看次数

iPhone SDK - 在后台线程中运行重复进程

我有一个iPhone应用程序,我想在后台每秒执行一个方法1.

所以在我的主线程中,我有以下代码UIViewController viewDidLoad():

[NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(repeatedMethod) userInfo:nil repeats:YES];
Run Code Online (Sandbox Code Playgroud)

使用以下方法:

-(void)repeatedMethod {
  if(!processIsRunning) {
    processIsRunning = YES;
    [self performSelectorInBackground:@selector(runProcessInBackground:) withObject:myImage];
  }
}

-(void)runProcessInBackground:(UIImage *)image {
  NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

  ... Some operations ...
  ...   also call a method on the main thread which sets isProcessRunning to NO

  [pool release]
}
Run Code Online (Sandbox Code Playgroud)

我有这个设置的方式,每秒产生一个新的线程(除非进程仍在运行,感谢我的processIsRunning标志).

现在,我的问题是:

(1)这是最好的方法吗?或者是否有更合适的方法来保留和重用后台线程?

(2)最快的方法是什么?每次调用方法时,我是否会通过调整新的后台线程来浪费时间?

代码工作得很好,当我在主线程上运行所有东西时,它只是相当慢一点(我最终不想这样做).

任何建议都会很棒!有没有人以前处理过这类问题?

非常感谢,布雷特

iphone multithreading cocoa-touch objective-c nsthread

4
推荐指数
1
解决办法
7930
查看次数

dispatch_after()的奇怪行为

我正在编写一个同时执行多项任务的应用程序.一个特殊的任务是每200毫秒做一次工作.为实现这一点,我使用了两种相互调用的方法.第一种方法只调用第二种方法,第二种方法使用dispatch_after()以延迟调用第一种方法.

经过几次迭代(300-400次)后,dispatch_after中的块在200 ms后不会执行.执行块需要大约5-10秒.请让我知道行为的原因(延迟).我也试过NSThread(sleepForTimeInterval :),我也遇到了同样的问题.我卡住了.请帮我.

代码如下.

Screen.h

#import <Foundation/Foundation.h>

@interface Screen : NSObject

-(void) firstMethod;
-(void) secondMethod;
@end
Run Code Online (Sandbox Code Playgroud)

Screen.m

#import "Screen.h"

@implementation Screen

int i=0;
dispatch_queue_t another_queue;
dispatch_time_t pop_time;

-(Screen*) init {
    self = [super init];
    if (self) {
        another_queue = dispatch_queue_create("com.test.timer.2", NULL);
    }
    return self;
}

-(void) firstMethod {
    i++;
    NSLog(@"i value : %d",i);
    [self secondMethod];
}

-(void) secondMethod {
    pop_time = dispatch_time(DISPATCH_TIME_NOW, 200 * NSEC_PER_MSEC);
    dispatch_after(pop_time, another_queue, ^(void){
        [self firstMethod];
    });
}

@end
Run Code Online (Sandbox Code Playgroud)

AppDelegate.h …

macos multithreading objective-c nsthread objective-c-blocks

4
推荐指数
1
解决办法
1107
查看次数

RetainCount可以在这个例子中使用吗?

RetainCount ==坏

retainCount禁忌,不可靠,不可预测,一般不应使用.我不会在我的代码中的任何地方使用它,但我在一个类中看到它,我以一种有趣的方式使用它.

我有一个类运行一个无限运行的线程,直到线程被取消.问题是线程增加了所有者的保留计数,在我的例子中是实例化它的类.所以,即使我已经完成了使用该类,该实例仍然会出现问题,除非管理我的类的人也有智能知道关闭该线程.这是一个解决方案,但这是我在代码中找到的.

- (oneway void)release
{
    // This override allows allows this object to be dealloced 
    // by shutting down the thread when the thread holds the last reference.
    // Otherwise, the object will never be dealloc'd
    if (self.retainCount == 2)
    {
        [self quitDispatchThread];
    }

    [super release];
}
Run Code Online (Sandbox Code Playgroud)

这是一个聪明的解决方案,但我不确定该怎么想.它会覆盖类上的释放并检查保留计数是否为2.换句话说,它会检查线程是否是保持对象存活的唯一因素(因为保留计数将从2减少到1)如果是,则终止线程(quitDispatchThread将阻塞直到线程终止).

所以...

你能依靠retainCount看看它是否是一个?

通常人们会说要保持清醒,retainCount因为你不知道那里是否有一些自动释放.但是,如果retainCount是1,那么我知道只有线程保持活着的事实我不必担心retainCount可能因某些自动释放等而关闭...

这段代码出了什么问题?

我准备删除它,但它实际上似乎是有道理的.其他对象不必知道我的类正在运行一个线程.其他对象可以安全地retainrelease甚至autorelease拥有线程,而不必担心查封了线程,因为它需要自己照顾的对象.

这段代码实际上感觉干净,令我感到惊讶.

编辑:: NSThread正在保留我的对象

我使用NSThread的事实增加了我的对象的保留计数.我的对象是,target并且selector是线程运行的方法.

initWithTarget:选择器:对象:

返回使用给定参数初始化的NSThread对象.

  • (id)initWithTarget:(id)目标选择器:(SEL)选择器对象:(id)参数 …

objective-c nsthread ios retaincount

3
推荐指数
1
解决办法
247
查看次数