标签: nsoperation

如何从NSOperationQueue启动的线程优化回调

考虑一下:

@interface SomeViewController : UIViewController {
    SomeChildObject *child;
}
@end

@implementation SomeViewController

- (void) viewDidLoad {
    ...
    child.delegate = self;
}

- (void) somethingHappened {
    NSInvocationOperation *operation = [[NSInvocationOperation alloc]
        initWithTarget:child
        selector:@selector(doSomething)
        object:nil];
[someNsOperationQueue addOperation:operation];
[operation release];
}

- (void) callbackA:(SomeData *)someData {
[self performSelectorOnMainThread:@selector(callbackAonMainThread:)
                       withObject:someData
                    waitUntilDone:NO];
}

- (void) callbackAonMainThread:(SomeData *)someData {
    ... do something with results in main thread, e.g UI feedback
}

- (void) callbackB:(SomeData *)someData {
[self performSelectorOnMainThread:@selector(callbackBonMainThread:)
                       withObject:someData
                    waitUntilDone:NO];
}

- (void) callbackBonMainThread:(SomeData *)someData { …
Run Code Online (Sandbox Code Playgroud)

iphone concurrency cocoa cocoa-touch nsoperation

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

NS操作和关键价值观察

我正在创建一个MyOperation对象(继承自NSOperation)并添加到NSOperationQueue.然后我在MyOperation上做KVO.我正在使用这种方法

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context;
Run Code Online (Sandbox Code Playgroud)

如果完成,从MyOperation获取值.在这个方法中,我使用其他类的方便方法来获取其他数据.

也许这里的observeValue ...方法有同步问题吗?

iphone objective-c nsoperation nsoperationqueue

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

NSOperation在添加到NSOperationQueue时没有执行依赖项

我试图弄清楚为什么在添加到NSOperationQueue(iOS5,ARC)时没有执行具有依赖关系的NSOperation:

@implementation NSOperationTest {
    NSOperationQueue *_operationQueue;
}

- (id)init {
    self = [super init];
    if (self) {
        _operationQueue = [[NSOperationQueue alloc] init];
    }
    return self;
}

-(void) test
{
    NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"op1 running");
    }];

    NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"op2 running");
    }];

    [op2 addDependency:op1];
    [_operationQueue addOperation:op2];
}
@end
Run Code Online (Sandbox Code Playgroud)

这让我抓狂,这里op1应该先执行op2,但要么执行,要么在没有依赖的情况下添加都可以正常工作.有人知道为什么吗?

提前致谢.

iphone cocoa-touch nsoperation nsoperationqueue ios5

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

在NSOperation中取消NSData initWithContentsOfURL

我目前在NSOperation中有以下代码,它有一个keyPath"isCancelled"的观察者:

    downloaded = FALSE;
    NSURL *url = [NSURL URLWithString:requestString];
    dataXML = [[NSData alloc] initWithContentsOfURL:url];
    downloaded = TRUE;
Run Code Online (Sandbox Code Playgroud)

我想这样做,以便observeValueForKeyPath函数能够取消dataXML继续或只是在NSOperation发送取消消息后完全停止NSOperation.NSOperation的取消操作取消仅通知操作它应该停止,但不会强制我的操作代码停止.

nsoperation nsdata ios

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

完成块对NSOperation类中的回调函数的优势是什么?

在了解NSOperation时,我想知道为什么完成块比我的子类NSOperation中的方法回调更有优势.我理解如何使用块来以更紧密耦合的方式组织我的代码,并且我自己也以这种方式使用它们(而不是使用处理来自多个对象的回调的委托方法).

在NSOperation的情况下,整个操作在类和我的子类中是自包含的.它包含单个操作,并且所有方法都专注于该单个操作.所以,在这种情况下,我没有看到完成块提供什么.我的理解中缺少什么?

cocoa cocoa-touch callback nsoperation objective-c-blocks

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

NSOperation Queue vs NSUrlConnection async

我有一个从Flickr下载几张照片的应用程序.现在,所有照片都是通过自定义NSOperation类运行下载的.NSOperationQueue但是,我听说NSUrlConnection异步效率更高,并且想知道哪种情况更好?或者,是否有第三种选择甚至比这两种更好?自定义NSOperation只是[NSData dataWithContentsOfURL:]在不同的照片上多次调用.

asynchronous objective-c nsurlconnection nsoperation ios

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

在两个NSOperations之间传递数据

我非常关注WWDC 2015关于高级NSOperations的会议,我对示例代码进行了一些介绍.

提供的抽象真的很棒,但有些东西我可能并不太了解.

我想在不使用MOC的情况下在两个后续的Operation子类之间传递结果数据.

想象一下,我有一个APIQueryOperation具有NSData?属性和第二操作ParseJSONOperation费时此属性.我如何为NSData?第二次操作提供这种意图?

我试过这样的事情:

queryOperation = APIQueryOperation(request: registerAPICall)  
parseOperation = ParseJSONOperation(data: queryOperation.responseData)  
parseOperation.addDependency(queryOperation) 
Run Code Online (Sandbox Code Playgroud)

但是当我输入实例的execute方法时ParseJSONOperation,与初始化器中的方法不同.

我做错了什么 ?

nsoperation swift

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

operation.cancel()不取消当前操作

使用operation.cancel()不会取消当前操作.如果队列中有操作,它似乎取消它,但如果它正在执行,那么它似乎不会停止它.

我是否需要将某些内容发送回我的子类操作中的main()函数以使其停止?

for operation in downloadQueue.operations {
    if operation.name == opName {
        if operation.isExecuting == true {
           operation.cancel()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

nsoperation nsoperationqueue swift

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

Mac OS X 10.6中的NSOperation是否有错误?

如果我NSOperation在发送之前发布了一个实例,-init我会得到一个segmentation fault.

我认为这是有效代码的原因:

  • Apple在其文档中做到了这一点.
  • Gnustep就是implementation of NSNumber这样做的,所以相当肯定这也是Apple的代码.(至少是.)
  • NSObjects -init不做任何事情,因此-release,属于NSObject应该在此之前工作.
// gcc -o test -L/System/Library/Frameworks -framework Foundation test.m

#import <Foundation/Foundation.h>

int main(int argc, char *argv[]) {
    NSOperation *theOperation = [NSOperation alloc];
    [theOperation release];
}
Run Code Online (Sandbox Code Playgroud)
  • 您怎么看?这是一个错误吗?
  • 你能告诉我一个具有相同行为的另一个类的例子吗?
  • 知道为什么会这样吗?

objective-c foundation nsoperation

0
推荐指数
1
解决办法
357
查看次数

iPhone上的NSOperation,Synchronous NSURLConnection和UIWebView

我有一个奇怪的问题.这是设置:

  • 我有一个NSOperationQueue,我将NSOperation子类对象添加到.这些使用NSURLConnection sendSynchronousRequest方法进行联网.据我所知,这些是完全异步的,因为它们是NSOperations,每个都有自己的线程.
  • 如果我在没有任何后台网络操作的情况下启动我的应用程序,将URL加载到UIWebView就可以了.
  • 如果我启动我的应用程序,并运行一些后台网络操作,将URL加载到UIWebView会导致此错误:

    错误域= WebKitErrorDomain代码= 102 UserInfo = 0x1996d60"帧加载中断"

并且任何后续加载UIWebView的尝试都会失败并出现相同的错误.

我需要注意UIWebView和NSURLConnection之间是否存在一些奇怪的交互?我的下一步是用完全异步的NSOperation替换同步调用,但这是一个奇怪的错误,我想我会问专家.

我已将错误隔离到NSURLConnection sendSynchronousRequest方法.如果我从NSOperation中调用它,UIWebView会破坏性地破坏.

102错误与WebKit中的某些"Policy Changed"错误有关,这在任何地方都很难/没有记录.

有人有什么想法吗?任何帮助是极大的赞赏!

编辑:看起来这是某种cookie问题.如果Web服务器通过后台HTTP请求设置cookie,UIWebView无法加载的任何原因?

iphone uiwebview nsurlconnection nsoperation

0
推荐指数
1
解决办法
3257
查看次数

为什么垃圾收集不适用于线程?

在我的应用程序中,每个东西都可以正常工作,直到我分离一个线程从文件中读取音频数据并进行处理.

无论我做什么,垃圾收集似乎都不知道这个线程上发生了什么.我试过[NSThread self],[NSThread currentThread],[[NSGarbageCollector defaultCollector] collectIfNeeded]和collectExhaustivly].我从NSThread转到NSOperation与NSOperationQueue.

这些建议的解决方案都没有奏效.最近,我从NSMutableArrays切换到

Float32* pfArray= calloc(numFloats, sizeof(Float32));

保存我的数据,并用来 free(pfArray); 释放那个记忆.这样做效果更好,但仍然泄漏了不错的数量.

在Activity Monitor中指示的"真实内存"遇到一些任意数字后,垃圾收集似乎开始工作到一定程度,但是当它确实起作用时,它并不释放所有正在使用的内存.它只是不会让它远高于任意阈值.

我已经读过GC是要走的路,但现在我不确定并且有一个几乎完全编写的程序.任何建议都会非常有帮助.谢谢!

cocoa garbage-collection objective-c nsoperation

0
推荐指数
1
解决办法
391
查看次数

NSOperation的倍数参数?

我在我的应用程序中使用NSOperationQueue,我想为我的操作设置多个参数,我该怎么做?

   NSOperationQueue *queue = [[[NSOperationQueue alloc] init] autorelease];
   NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(methodCall) object:nil];
  [queue addOperation:operation];
  [operation release];
Run Code Online (Sandbox Code Playgroud)

iphone cocoa-touch nsoperation nsoperationqueue nsinvocationoperation

0
推荐指数
1
解决办法
2089
查看次数

dispatch_async和retain(非ARC)

在非ARC应用程序中,我有一个NSOperation子类,它由一个委托排队,看起来像:

// note that the delegate and element properties are retained

-(id)initWithDelegate:(id<SomeDelegate>)inDelegate element:(SomeElement *)inElement
{
    if (self = [super init])
    {
        [self setDelegate:inDelegate];
        [self setElement:inElement];
    }
}

-(void)dealloc
{
    [_delegate release];
    [_element release];
    [super dealloc];
}

-(void)main
{
    // do stuff

    dispatch_async(dispatch_get_main_queue(), ^{
         [[self delegate] doSomething:[self element]];
    });
}
Run Code Online (Sandbox Code Playgroud)

由于[[self delegate] doSomething:[self element]]将在我的NSOperation对象可能被解除分配后被调用,在将此操作添加到队列之前,是否需要确保在委托中保留"element"?元素对象保留在应用程序的其他位置,但可能会在那里释放.我需要确保当我的代表从NSOperation收回它时,它仍然是一个有效的对象.

只是想知道在dispatch_async中调用它的行为是否会保留传递给它的参数.我当然可以使用NSInvocation和performSelectorOnMainThread来保留它.

objective-c retain nsoperation dispatch-async

0
推荐指数
1
解决办法
321
查看次数