考虑一下:
@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) 我正在创建一个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 ...方法有同步问题吗?
我试图弄清楚为什么在添加到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,但要么执行,要么在没有依赖的情况下添加都可以正常工作.有人知道为什么吗?
提前致谢.
我目前在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时,我想知道为什么完成块比我的子类NSOperation中的方法回调更有优势.我理解如何使用块来以更紧密耦合的方式组织我的代码,并且我自己也以这种方式使用它们(而不是使用处理来自多个对象的回调的委托方法).
在NSOperation的情况下,整个操作在类和我的子类中是自包含的.它包含单个操作,并且所有方法都专注于该单个操作.所以,在这种情况下,我没有看到完成块提供什么.我的理解中缺少什么?
我有一个从Flickr下载几张照片的应用程序.现在,所有照片都是通过自定义NSOperation类运行下载的.NSOperationQueue但是,我听说NSUrlConnection异步效率更高,并且想知道哪种情况更好?或者,是否有第三种选择甚至比这两种更好?自定义NSOperation只是[NSData dataWithContentsOfURL:]在不同的照片上多次调用.
我非常关注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,与初始化器中的方法不同.
我做错了什么 ?
使用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在发送之前发布了一个实例,-init我会得到一个segmentation fault.
我认为这是有效代码的原因:
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)
我有一个奇怪的问题.这是设置:
如果我启动我的应用程序,并运行一些后台网络操作,将URL加载到UIWebView会导致此错误:
错误域= WebKitErrorDomain代码= 102 UserInfo = 0x1996d60"帧加载中断"
并且任何后续加载UIWebView的尝试都会失败并出现相同的错误.
我需要注意UIWebView和NSURLConnection之间是否存在一些奇怪的交互?我的下一步是用完全异步的NSOperation替换同步调用,但这是一个奇怪的错误,我想我会问专家.
我已将错误隔离到NSURLConnection sendSynchronousRequest方法.如果我从NSOperation中调用它,UIWebView会破坏性地破坏.
102错误与WebKit中的某些"Policy Changed"错误有关,这在任何地方都很难/没有记录.
有人有什么想法吗?任何帮助是极大的赞赏!
编辑:看起来这是某种cookie问题.如果Web服务器通过后台HTTP请求设置cookie,UIWebView无法加载的任何原因?
在我的应用程序中,每个东西都可以正常工作,直到我分离一个线程从文件中读取音频数据并进行处理.
无论我做什么,垃圾收集似乎都不知道这个线程上发生了什么.我试过[NSThread self],[NSThread currentThread],[[NSGarbageCollector defaultCollector] collectIfNeeded]和collectExhaustivly].我从NSThread转到NSOperation与NSOperationQueue.
这些建议的解决方案都没有奏效.最近,我从NSMutableArrays切换到
Float32* pfArray= calloc(numFloats, sizeof(Float32));
保存我的数据,并用来
free(pfArray);
释放那个记忆.这样做效果更好,但仍然泄漏了不错的数量.
在Activity Monitor中指示的"真实内存"遇到一些任意数字后,垃圾收集似乎开始工作到一定程度,但是当它确实起作用时,它并不释放所有正在使用的内存.它只是不会让它远高于任意阈值.
我已经读过GC是要走的路,但现在我不确定并且有一个几乎完全编写的程序.任何建议都会非常有帮助.谢谢!
我在我的应用程序中使用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
在非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来保留它.
nsoperation ×13
iphone ×5
objective-c ×5
cocoa-touch ×4
cocoa ×3
ios ×2
swift ×2
asynchronous ×1
callback ×1
concurrency ×1
foundation ×1
ios5 ×1
nsdata ×1
retain ×1
uiwebview ×1