当你需要在网络任务或操作的完成块中的主线程上执行某些操作时,哪种方式获取它将是最合适的,为什么?:
OperationQueue.main.addOperationDispatchQueue.main.async我有一个NSFetchedResultsController和几个操作更新托管对象在不同的线程上通过NSOperationQueue.
FRC(带有谓词)看起来像这样:
- (NSFetchedResultsController*)fetchedResultsController
{
if(fetchedResultsController) return fetchedResultsController;
NSManagedObjectContext* mainContext = [self managedObjectContext];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity:[NSEntityDescription entityForName:@"Check" inManagedObjectContext:mainContext]];
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"isSync == %@", [NSNumber numberWithBool:NO]]];
[fetchRequest setFetchBatchSize:10];
fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:mainContext sectionNameKeyPath:nil cacheName:nil];
fetchedResultsController.delegate = self;
[fetchRequest release], fetchRequest = nil;
return fetchedResultsController;
}
Run Code Online (Sandbox Code Playgroud)
主线程和线程操作具有自己的托管对象上下文.他们只共享同一个协调员.
在线程操作中,我将isSync属性从更改NO为YES.要知道Check要更新的实体是什么,主要上下文将传递给线程化的a NSManagedObjectID.线程操作检索托管对象,如下所示:
-(void)main
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSManagedObjectContext *exportContext = [[NSManagedObjectContext alloc] …Run Code Online (Sandbox Code Playgroud) core-data nsfetchedresultscontroller nsoperationqueue nsmanagedobjectcontext ios
什么是iOS中多线程的最佳方式,因为我们有三个选项GCD NSThread,和NSOperationQueue?我很困惑哪一个是最好的?如果没有,那么哪个应该用于什么情况以及它们如何不同,如果有人有一些很好的使用示例NSOperationQueue,请分享以便我可以学习.
multithreading nsthread nsoperationqueue grand-central-dispatch ios
我是块的忠实粉丝,但没有将它们用于并发.经过一些谷歌搜索,我拼凑了这个想法,以隐藏我在一个地方学到的一切.目标是在后台执行一个块,当它完成时,执行另一个块(如UIView动画)......
- (NSOperation *)executeBlock:(void (^)(void))block completion:(void (^)(BOOL finished))completion {
NSOperation *blockOperation = [NSBlockOperation blockOperationWithBlock:block];
NSOperation *completionOperation = [NSBlockOperation blockOperationWithBlock:^{
completion(blockOperation.isFinished);
}];
[completionOperation addDependency:blockOperation];
[[NSOperationQueue mainQueue] addOperation:completionOperation];
NSOperationQueue *backgroundOperationQueue = [[NSOperationQueue alloc] init];
[backgroundOperationQueue addOperation:blockOperation];
return blockOperation;
}
- (void)testIt {
NSMutableString *string = [NSMutableString stringWithString:@"tea"];
NSString *otherString = @"for";
NSOperation *operation = [self executeBlock:^{
NSString *yetAnother = @"two";
[string appendFormat:@" %@ %@", otherString, yetAnother];
} completion:^(BOOL finished) {
// this logs "tea for two"
NSLog(@"%@", string);
}];
NSLog(@"keep this operation …Run Code Online (Sandbox Code Playgroud) objective-c nsoperation nsoperationqueue ios nsblockoperation
我打算使NSOperationQueue串行而不是并发.
我知道的一种方法是:
NSOperationQueue *globalQueue;
globalQueue.maxConcurrentOperationCount =1;
Run Code Online (Sandbox Code Playgroud)
还有其他方法吗?
我正在使用NSOperationQueue的addOperationWithBlock.从块内,我如何检查是否应该取消操作?或访问任何NSOperation属性/方法?
[myOperationQueue addOperationWithBlock: ^{
while ( /* long running loop */ )
{
// how to determine here if I need to cancel?
// for that matter, access any NSOperation properties/methods?
}
}];
Run Code Online (Sandbox Code Playgroud)
使用NSBlockOperation是更好的方法吗?
我需要将异步操作放入操作队列,但是,它们需要在另一个之后执行
self.operationQueue = [NSOperationQueue new];
self.operationQueue.maxConcurrentOperationCount = 1;
[self.operationQueue addOperationWithBlock:^{
// this is asynchronous
[peripheral1 connectWithCompletion:^(NSError *error) {
}];
}];
[self.operationQueue addOperationWithBlock:^{
// this is asynchronous
[peripheral2 connectWithCompletion:^(NSError *error) {
}];
}];
Run Code Online (Sandbox Code Playgroud)
问题是,由于peripheralN connectWithCompletion是异步的,队列中的操作结束而下一个执行,我需要模拟,peripheralN connectWithCompletion是同步的并等待操作结束,直到异步块执行
所以我需要这样的行为,只使用操作队列
[peripheral1 connectWithCompletion:^(NSError *error) {
[peripheral2 connectWithCompletion:^(NSError *error) {
}];
}];
Run Code Online (Sandbox Code Playgroud) 我需要暂停一个插入NSOperationQueue的正在运行的NSOperation.目前我取消所有操作并重新启动它们.但这会导致在完成流程方面出现某种重复.我尝试使用NSOperationQueue的setSuspended标志.但它并没有暂停这项行动.有什么出路吗?
我正在将我的代码从常规GCD移动到NSOperationQueue因为我需要一些功能.我的很多代码都依赖于dispatch_after才能正常工作.有没有办法做类似的事情NSOperation?
这是我需要转换为的一些代码NSOperation.如果您可以提供使用此代码转换它的示例,那就太棒了.
dispatch_queue_t queue = dispatch_queue_create("com.cue.MainFade", NULL);
dispatch_time_t mainPopTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(timeRun * NSEC_PER_SEC));
dispatch_after(mainPopTime, queue, ^(void){
if(dFade !=nil){
double incriment = ([dFade volume] / [self fadeOut])/10; //incriment per .1 seconds.
[self doDelayFadeOut:incriment with:dFade on:dispatch_queue_create("com.cue.MainFade", 0)];
}
});
Run Code Online (Sandbox Code Playgroud) xcode objective-c nsoperationqueue grand-central-dispatch ios
是否可以通过将NSoperationQueue对象设置maxConcurrentOperationCount为1 来将对象用作串行FIFO队列?
我注意到文档声明......
对于最大并发操作数设置为1的队列,这相当于一个串行队列.但是,您永远不应该依赖于操作对象的串行执行.
这是否意味着无法保证FIFO执行?
nsoperationqueue ×10
ios ×9
nsoperation ×4
objective-c ×4
cocoa ×2
asynchronous ×1
core-data ×1
fifo ×1
iphone ×1
macos ×1
nsthread ×1
swift ×1
ui-thread ×1
xcode ×1