NSOperation and NSOperationQueue working thread vs main thread

后端 未结 6 2009
心在旅途
心在旅途 2020-11-28 01:00

I have to carry out a series of download and database write operations in my app. I am using the NSOperation and NSOperationQueue for the same.

6条回答
  •  遥遥无期
    2020-11-28 01:46

    The execution thread of NSOperation depends on the NSOperationQueue where you added the operation. Look out this statement in your code -

    [[NSOperationQueue mainQueue] addOperation:yourOperation]; // or any other similar add method of NSOperationQueue class
    

    All this assumes you have not done any further threading in main method of NSOperation which is the actual monster where the work instructions you have (expected to be) written.

    However, in case of concurrent operations, the scenario is different. The queue may spawn a thread for each concurrent operation. Although it's not guarrantteed and it depends on system resources vs operation resource demands at that point in the system. You can control concurrency of operation queue by it's maxConcurrentOperationCount property.

    EDIT -

    I found your question interesting and did some analysis/logging myself. I have NSOperationQueue created on main thread like this -

    self.queueSendMessageOperation = [[[NSOperationQueue alloc] init] autorelease];
    
    NSLog(@"Operation queue creation. current thread = %@ \n main thread = %@", [NSThread currentThread], [NSThread mainThread]);
    self.queueSendMessageOperation.maxConcurrentOperationCount = 1; // restrict concurrency
    

    And then, I went on to create an NSOperation and added it using addOperation. In the main method of this operation when i checked for current thread,

    NSLog(@"Operation obj =  %@\n current thread = %@ \n main thread = %@", self, [NSThread currentThread], [NSThread mainThread]);
    

    it was not as main thread. And, found that current thread object is not main thread object.

    So, custom creation of queue on main thread (with no concurrency among its operation) doesn't necessarily mean the operations will execute serially on main thread itself.

提交回复
热议问题