Just do the calculation within a dispatch_async within computeSimething.

On Mar 14, 2016, at 4:17 AM, Gerriet M. Denkmann wrote:

> 
>> On 14 Mar 2016, at 14:17, Quincey Morris 
>> <quinceymor...@rivergatesoftware.com> wrote:
>> 
>> On Mar 13, 2016, at 23:50 , Gerriet M. Denkmann <gerr...@mdenkmann.de> wrote:
>>> 
>>> - (void)computeSomething
>>> {
>>>     self.message1 = @“Start computing”;
>>>     //      some seconds of computations
>>>     self.message1 = @“Result = 42”;
>>> }
>> 
>> Assume, conceptually, that drawing only takes place asynchronously (that is 
>> to say, setting a new value on the string invokes setNeedsDisplay, that’s 
>> all), and it’s obvious why this isn’t going to work.
>> 
>> But the real issue is not that the text field won’t update, it’s that you’re 
>> blocking the main thread with computation. You should move the computation 
>> off the main thread — using dispatch_async to a default queue. At the end of 
>> the computation, go back to the main thread (dispatch_async again, 
>> specifying the main queue this time) and put the result in the text field.
>> 
>> This is, of course, going to introduce threading issues into your design. If 
>> the background thread keeps its results private (within the thread) until 
>> you switch back to the main thread, you can actually update any permanent 
>> data structures on the main thread, avoiding the need for locks or other 
>> synchronization techniques. However, you have to arrange for the main thread 
>> to avoid trying to use the results before the background computation is 
>> done, or to start any new computations, until the old ones are done, as far 
>> as such safety checks are necessary for your app.
>> 
>> (You can use NSOperationQueue instead of GCD, but I don’t see a lot of 
>> advantage in that. The consequences are the same.)
> 
> You are absolutely right that a background would be the right thing.
> But this is just a small tool for testing, and it will not take more than a 
> few seconds, so I am trying to avoid this.
> 
> But I have found a solution (you mentioning setNeedsDisplay was a great help):
> 
> - (void)computeSomething
> {
>       self.textField1.stringValue = @“Start computing”;
>       [self.textField1 display];
>       //      some seconds of computations
>       self.textField1.stringValue = @“Result = 42”;
> }
> 
> Gerriet.
> 
> 
> 
> _______________________________________________
> 
> Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)
> 
> Please do not post admin requests or moderator comments to the list.
> Contact the moderators at cocoa-dev-admins(at)lists.apple.com
> 
> Help/Unsubscribe/Update your Subscription:
> https://lists.apple.com/mailman/options/cocoa-dev/zav%40mac.com
> 
> This email sent to z...@mac.com


_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to