MODIFIED ON: May 17, 2024 / ALIGNMINDS TECHNOLOGIES / 0 COMMENTS
Each day at our work consists of a sequence of tasks that fill our working hours. In the same way, when you create an application, all the interface components (table views, UI controls, alerts, etc.) are run inside the main thread of your application. At some point in your application, you will want to populate these views with data. This data can be retrieved from the disk, the web, a database, etc. Using NSOperation, you can manage these data retrieval tasks efficiently without blocking the main thread.
The issue that we face when we want to populate or handle a huge amount of data is
‘How would you efficiently load this data into your application interface while still allowing the user to have control of the application without any disturbance?’
Many applications in the app store simply ‘freeze’ while their application data is loaded. This will disappoint the user interaction. The secret to making apps without this problem is to move the unnecessary work (the activities which can take place without user interaction) to the background as possible.
The iOS developer has two options here.
- Grand Central Dispatch
- NSOperation
Let me explain about NSOperation.
NSOperationQueue
NSOperationQueue manages the concurrent execution of code operations in Xcode. It acts as a priority queue because operations are executed in a First-In-First-Out manner, with higher-priority (NSOperation.queuePriority) ones getting to the lower-priority ones.
NSOperation
NSOperation is a single unit of work. It’s an abstract class that provides a useful, thread-safe structure for programming.NSOperation will perform network requests, text processing, or any other repeatable long-running task that produces associated state or data.
There are two different operations you can create, which are prebuilt in once which are NSInvocationOperation and NSBlockOperation.
Priority
All operations may not be equally important. Setting the queuePriority property will promote or defer an operation in an NSOperationQueue according to the following rankings:
NSOperationQueuePriority
typedef enum : NSInteger { NSOperationQueuePriorityVeryLow = -8, NSOperationQueuePriorityLow = -4, NSOperationQueuePriorityNormal = 0, NSOperationQueuePriorityHigh = 4, NSOperationQueuePriorityVeryHigh = 8 } NSOperationQueuePriority;
The following enumerated values are used to denote the priority of operation. Operations are considered based on priority.
NSQualityOfService
typedef enum : NSInteger { NSQualityOfServiceUserInteractive = 0×21, NSQualityOfServiceUserInitiated = 0×19, NSQualityOfServiceUtility = 0×11, NSQualityOfServiceBackground = 0×09, NSQualityOfServiceDefault = -1 } NSQualityOfService;
Implementation
NSBlockOperation always executes a block. NSInvocationOperation executes an NSInvocation ( a method defined by selector, target or object).
NSInvocationOperation
NSOperationQueue *myQueue = [[NSOperationQueue alloc] init]; NSInvocationOperation *operation1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(printNumbers) object:@”operation1″]; operation1.queuePriority = NSOperationQueuePriorityLow; operation1.qualityOfService = NSOperationQualityOfServiceBackground; [myQueue addOperation:operation1]; NSInvocationOperation *operation2 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(PrintAlphabets) object:@”operation2″]; operation2.queuePriority = NSOperationQueuePriorityHigh; operation2.qualityOfService = NSOperationQualityOfServiceBackground; [myQueue addOperation:operation2]; -(void)printNumbers { for (int i = 0; i<10; i++) { NSLog(@”%d”,i); } } -(void)PrintAlphabets { for (char a = ‘a’; a <= ‘z’; a++) { NSLog(@”%c”,a); } }
Output
a
0
b
1
c
2
d
3
.
.
NSBlockOperation
NSOperationQueue *myQueue = [[NSOperationQueue alloc] init]; NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^(void){ [self PrintAlphabets]; }]; operation1.queuePriority = NSOperationQueuePriorityLow; operation1.qualityOfService = NSOperationQualityOfServiceBackground; [myQueue addOperation:operation1]; NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^(void){ [self printNumbers]; }]; operation2.queuePriority = NSOperationQueuePriorityHigh; operation2.qualityOfService = NSOperationQualityOfServiceBackground; [myQueue addOperation:operation2];
Output
a
0
b
1
c
2
d
3
.
.
CompletionBlock
When an NSOperation completes, it will execute its completionBlock only once. This provides a way to customize the behaviour of operation when used in a model or view controller.
NSOperation *operation = …; operation.completionBlock = ^{ NSLog(“Completed”); }; [[NSOperationQueue mainQueue] addOperation:operation];
I hope the above tips shared based on my experience help you when you need to handle NSOperation in your next project.
Happy Coding!
-
Recent Posts
- Top Steps for Optimizing Your Generative AI Model
- How Generative AI Helps with Fraud Prevention in Healthcare
- 8 Leading AI Development Companies Driving Innovation in 2024
- How to Develop a Roadmap for GenAI Implementation?
- How Conversational AI Can Revolutionise Customer Service?
-
Categories
- MVP Development (5)
- AlignMinds (55)
- Operating Systems (1)
- Android POS (3)
- Application Hosting (1)
- Artificial Intelligence (34)
- Big Data (2)
- Blockchain (1)
- Cloud Application Development (7)
- Software Development (31)
- Software Testing (9)
- Strategy & User Experience Design (4)
- Web Application Development (23)
- Cyber Security (6)
- Outsourcing (7)
- Programming Languages (3)
- DevOps (5)
- Software Designing (6)
- How to Code (4)
- Internet of Things (1)
- Machine Learning (2)
- Mobile App Marketing (4)
- Mobile Application Development (18)
- Mobile Applications (5)