Tag: nsoperation

NSOperation属性重写(isExecuting / isFinished)

我在Swift中NSOperation ,并且需要重写isExecuting和isFinished属性,因为我重写了start方法。 我遇到的问题是如何保留键值观察(KVO),同时也能够覆盖这些属性。 通常在Obj-C中,这将是相当容易重新声明类扩展JSONOperation ()定义中的readwrite属性。 但是,我并没有在Swift中看到这个function。 例: class JSONOperation : NSOperation, NSURLConnectionDelegate { var executing : Bool { get { return super.executing } set { super.executing } // ERROR: readonly in the superclass } // Starts the asynchronous NSURLConnection on the main thread override func start() { self.willChangeValueForKey("isExecuting") self.executing = true self.didChangeValueForKey("isExecuting") NSOperationQueue.mainQueue().addOperationWithBlock( { self.connection […]

学习NSBlockOperation

我是一个块的粉丝,但没有使用它们的并发性。 经过一番谷歌search之后,我把这个想法拼凑起来,把我在一个地方学到的所有东西都隐藏起来。 目标是在后台执行一个块,当它完成时,执行另一个块(如UIViewanimation)… – (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 […]

NSOperation和NSURLConnection神秘

我试图从一些服务器使用NSOperation和NSOperationQueue下载多个图像。 我的主要问题是下面的代码片段和这个链接有什么区别,性能明智吗? 我更喜欢第二种解决scheme,因为我们对操作有更多的控制,它更加清洁,如果连接失败,可以正确处理。 如果我尝试使用下面的代码从服务器上下载大约300张图片,我的应用程序将会有相当大的延迟,如果我启动应用程序,并立即进入主屏幕,然后回到应用程序,我会崩溃,因为没有足够的时间让应用程序再次活跃。 如果我取消注释[queue setMaxConcurrentOperationCount:1],则用户界面是响应的,如果它进入后台并返回到前台,它将不会崩溃。 但是,如果我实现类似于上面的链接,我不需要担心设置maxConcurrentOperationCount,默认值是罚款。 一切都响应,没有崩溃,似乎所有的队列得到更快完成。 所以这带来了我的第二个问题,为什么[queue setMaxConcurrentOperationCount:1]在我的代码中有如此大的影响? 从文档中,我认为将maxConcurrentOperationCount保留为默认值是可以的,而这只是告诉队列根据某些因素决定最佳值。 这是我在堆栈溢出的第一篇文章,所以希望这是有道理的,谢谢你的帮助! NSOperationQueue *queue = [[NSOperationQueue alloc] init]; //[queue setMaxConcurrentOperationCount:1]; for(NSURL *URL in URLArray) { [queue addOperationWithBlock:^{ NSHTTPURLResponse *response = nil; NSError *error = nil; NSData * data = [NSURLConnection sendSynchronousRequest:[NSURLRequest requestWithURL:URL] returningResponse:&response error:&error]; if(!error && data) { [data writeToFile:path atomically:YES]; } }]; }

我可以用addOperationWithBlock取消添加到NSOperationQueue的Block吗?

我读了许多文章说“块是未来!!!”。 我想知道它是否涉及到在后台运行操作。 例如,我有一个表格视图,其中有来自networking的图像。 现在我可以使用+[NSOperationQueue addOperationWithBlock:]来获取它们。 当单元格变为可见时,会将操作发送到队列。 但有一种方法可以取消它,一旦细胞滚动屏幕? 或者是唯一的方法来做到NSOperation子类? 使用块很容易,所以我只是在我试图解决这个 NSOperation子类的例子之前问这个问题…

核心数据/ NSOperation:通过枚举和删除对象时崩溃

我有一个核心的数据为基础的应用程序,有一个对象(列表)的对象(列表项)的关系。 我正在设备之间同步数据,并作为我从后台线程中的XML文件导入列表(通过NSOperation子类)的一部分。 当我更新一个现有的列表,我删除它的所有旧的列表项(从特定于该线程的NSManagedObjectContext),并从XML文件中取代新的列表项…删除通过枚举通过项目列表: for (ListItemCD *item in listToUpdate.listItems) { [self.importContext deleteObject:item]; } 然而,偶尔有一次,我在枚举期间崩溃了: *由于未捕获的exception“NSGenericException”而终止应用程序,原因:“* Collection <_NSFaultingMutableSet:0x4fcfcb0>在枚举时发生了变化。 我不确定从哪里开始寻找这个问题的原因。 枚举发生时,我不修改代码的任何其他部分中的列表。 可以有多个线程在同一时间,因为不同的列表导入/更新…将保存在另一个线程的上下文导致一个问题 – 因为它也通知主要上下文(如果它发生在同一时间的枚举) ? 如果有帮助,下面是我的NSOperation子类的“main”函数中的代码(我从Core Data中删除旧列表项,并通过parsingXML数据来更新列表): – (void)main { // input the xml data into GDataXML NSData *xmlData = [[NSMutableData alloc] initWithContentsOfFile:self.filePath]; NSError *error; GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:xmlData options:0 error:&error]; // get the list name […]

dispatch_async中的asynchronousurl请求

我试图在一个特定的函数中实现asynchronousurl请求,我想要完成所有这些请求,然后执行一个特定的操作,但该操作先于请求,即在请求完成之前调用它。 dispatch_queue_t fetchQ = dispatch_queue_create("Featured Doc Downloader", NULL); dispatch_async(fetchQ, ^{ [self myAsyncMultipleURLRequestFunction]; dispatch_sync(dispatch_get_main_queue(), ^{ [self updateUIFunction]; }); }); -(void)myAsyncMultipleURLRequestFunction { for (int i=0; i<count; i++) { NSURLConnection *loginConnection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self]; } } 现在在myAsyncMultipleURLRequestFunction完成所有请求之前调用updateUIFunction。 也试过这与NSOperaitonQueue,但不能做我真正想要的。 [_operationQ addOperationWithBlock: ^ { for (int i=0; i<count; i++) { NSURLConnection *loginConnection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self]; } […]

当应用程序在iOS上进入后台时继续操作

在我的应用程序中,我有一些NSOperation从一个在线数据库更新一些核心数据元素,有时更新需要一些分钟,当iPhone的屏幕locking,应用程序进入后台模式,并停止此更新,所以我有重新打开应用程序继续更新,所以我有很多堆栈溢出search,我已经find一些信息: beginBackgroundTaskWithExpirationHandler 这是从苹果的方法,让应用程序在后台模式下继续一些任务,我已经这样做: – (void)applicationDidEnterBackground:(UIApplication *)application { UIApplication *app = [UIApplication sharedApplication]; UIBackgroundTaskIdentifier bgTask; bgTask = [app beginBackgroundTaskWithExpirationHandler:^{ [app endBackgroundTask:bgTask]; }]; } 现在的应用程序继续在后台的任务,似乎一切正常,所以我的问题是,我使用这种方法是安全的? 还是有更好的模式? 谢谢

如何取消用addOperationWithBlock创build的操作?

我正在使用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? } }]; 是更好的方式来做到这一点使用NSBlockOperation?

在iOS4设备上发送大量数据的最佳做法?

我有一个应用程序需要发送数据(使用POST)到服务器。 此function必须在其中一个NavigationController子控制器上,用户应该能够离开此控制器和/或closures应用程序(只支持iPhone4 / iOS4)。 我应该使用线程/ NSOperations还是/和使用现有的asynchronous方法发送数据? 任何想法/最佳实践如何实现这一点?

NSOperation – 强制操作等待其他人dynamic

我想实现一个操作队列,我有以下情况: NSOperation A NSOperation B NSOperation C NSOperation D NSOperationQueue queue 我开始添加A queue 。 在A的执行过程中,我需要从B获取一些数据,而我不能继续使用A直到B返回我需要的数据。 B取决于C和C取决于D也会出现相同的情况。 为了pipe理这个,在每个NSOperation我有这个代码: NSOperation *operation; //This can be A, B, C, D or any other NSOperation [self setQueuePriority:NSOperationQueuePriorityVeryLow]; //Set the current NSOperation with low priority [queue addOperation: operation]; //Add the operation that I want to the queue while(!operation.isFinished && !self.isCancelled){} //I […]