16 Feb 2013, 21:26
Generic-user-small

Tim West (4 posts)

Your chapter on core data and threading is very helpful and has helped me get my own import functions running in the background.

But I am confused because in your code examples you add the mail and the import operations to the main queue. So you are still blocking the main queue when you run the operations.

I have had luck with using the following to setup and run things in the background - but I am wondering if there are some implications that I am not aware of that will make this fail:

- (NSOperationQueue *) dataProcessQueue {
    if (!_dataProcessQueue) {
        _dataProcessQueue = [[NSOperationQueue alloc] init];
        _dataProcessQueue.name = @"Data Processing and Import Queue";
        _dataProcessQueue.maxConcurrentOperationCount = 1;
    }
	
    return _dataProcessQueue;
}

</code>

My import takes about 30 seconds to create 700 objects so I dont want to block the main queue. To let the main queue update the UI as data is getting imported I issue a save from my import operation every 40 entries.

Thanks

01 Jul 2014, 20:22
Avatarsmall_pragsmall

Marcus S. Zarra (254 posts)

The -[NSOperationQueue mainQueue] can be a bit confusing. I always explain the NSOperationQueue as the manager. If you have NSOperation instances with -isConcurrent set to NO then they will run on the thread that created the NSOperationQueue which in the case of my examples would be the main queue.

However if you are using NSOperation instances with -isConcurrent set to YES (the default) then the NSOperationQueue will spawn a new thread for each NSOperation up to the maximum number of threads that it is configured to support. None of the NSOperation instances will run on the thread that created the NSOperationQueue instance.

That is why I can use that convenience method and why it is there.

19 Feb 2013, 04:10
Generic-user-small

Tim West (4 posts)

Thanks for the response - that may work well on the mac but on the iPhone I get:

DLog(@”Number of threads on mainQueue %d”, [[NSOperationQueue mainQueue] maxConcurrentOperationCount]);

Number of threads on mainQueue 1

So calling on the main queue does block the UI in my hands. I tested both on iPhone 4S and 5 to see if it was phone dependent but I get the same result on both.

Also, having your own operation queue allow you to call cancelAllOperations on the queue if you want to cancel all the ongoing import or data processing. I dont know if calling cancelAllOperations on the main queue would be such a good idea.

21 Feb 2013, 20:45
Avatarsmall_pragsmall

Marcus S. Zarra (254 posts)

I explored this a bit further based on this conversation and my assumption was incorrect. It does seem that @+[NSOperationQueue mainQueue]@ gives you a special case @NSOperationQueue@ that will only execute code on the main queue and thereby ignoring/breaking the contract.

I will update the same code in the projects to account for that clarification.

14 Mar 2014, 15:58
Generic-user-small

Bram Plessers (1 post)

I think the source code of the book has not been updated.
The code from the book stil blocks the UI when trying to update the UI while importing a lot of data. Using Tim’s method everything runs as expected.

The folder of the book was created on Feb 20 2013.
A day before Marcus’ last response in this thread.

01 Jul 2014, 20:22
Avatarsmall_pragsmall

Marcus S. Zarra (254 posts)

This behavior has definitely changed since the last book update. the -mainQueue now ignores the concurrency flag and always runs them on the main queue. This will get changed in the next version of the book.

  You must be logged in to comment