Register a SA Forums Account here!
JOINING THE SA FORUMS WILL REMOVE THIS BIG AD, THE ANNOYING UNDERLINED ADS, AND STUPID INTERSTITIAL ADS!!!

You can: log in, read the tech support FAQ, or request your lost password. This dumb message (and those ads) will appear on every screen until you register! Get rid of this crap by registering your own SA Forums Account and joining roughly 150,000 Goons, for the one-time price of $9.95! We charge money because it costs us money per month for bills, and since we don't believe in showing ads to our users, we try to make the money back through forum registrations.
 
  • Post
  • Reply
plasticbugs
Dec 13, 2006

Special Batman and Robin
How can I do something like this with GCD? Bad pseudocode follows. Sorry it's messy, but my actual code is messier, so I've spared you and me that disgrace.
EDIT for 'clarity'

dispatch_async(queue, ^{

for item in arrayOfItems {
[item doAwesomeCoolAsynchronousMethodOnABackgroundThreadOnEachItem]
dispatch_async(dispatch_get_main_queue(), ^{
[do something after each item loads with my mbprogress hud to update progress loading animation on the main thread];
});
}
}

What's happening is the iterator is looping through all my items. But the instance method on each item which runs in a background thread is getting called on each item and my app only jumps to the main thread to update my "progress loading animation" after all the items have finished their way through my for loop. Is there a way to call a UI method on the main thread after each individual item runs through the iterator?

Here's what my log looks like. Current Record is being logged after each record is processed. However, the second set of log statements are being logged from inside the for loop but are happening on the main thread. -- those floats show the progress loader percentage that should be updating my loader animation. But it's all happening at once, after all my items load.

2013-03-20 22:52:43.866 Game Alert[13425:c07] FINSHED JSON GET
2013-03-20 22:52:43.867 Game Alert[13425:c07] Current Record:1
2013-03-20 22:52:43.868 Game Alert[13425:c07] Current Record:2
...
2013-03-20 22:52:43.877 Game Alert[13425:c07] Current Record:14
2013-03-20 22:52:43.878 Game Alert[13425:c07] Current Record:15
2013-03-20 22:52:43.879 Game Alert[13425:c07] 0.066667
2013-03-20 22:52:43.879 Game Alert[13425:c07] 0.133333
...
2013-03-20 22:52:43.883 Game Alert[13425:c07] 0.933333
2013-03-20 22:52:43.884 Game Alert[13425:c07] 1.000000

plasticbugs fucked around with this message at 07:35 on Mar 21, 2013

Adbot
ADBOT LOVES YOU

pokeyman
Nov 26, 2006

That elephant ate my entire platoon.
What's the awesome cool asynchronous method? Maybe you can modify that method to pass in a completion handler, which dispatches back to the main thread to update a progress animation.

For more elegance, but maybe more work, have a look at dispatch sources.

plasticbugs
Dec 13, 2006

Special Batman and Robin

pokeyman posted:

What's the awesome cool asynchronous method? Maybe you can modify that method to pass in a completion handler, which dispatches back to the main thread to update a progress animation.

For more elegance, but maybe more work, have a look at dispatch sources.

I'm hitting my S3 bucket to download and store an image for each item into core data. I'd like to show download progress as the operation takes 20 seconds or so. Thanks for the help!

Carthag Tuek
Oct 15, 2005

Tider skal komme,
tider skal henrulle,
slægt skal følge slægters gang



Just a tip, you can use code tags, makes it easier to read:

Objective-C code:
dispatch_async(queue, ^{for item in arrayOfItems {
  [item doAwesomeCoolAsynchronousMethodOnABackgroundThreadOnEachItem]
    dispatch_async(dispatch_get_main_queue(), ^{
      [do something after each item loads with my mbprogress hud to update progress loading animation on the main thread];
    });
  }
}
But I would probably have the actual S3 fetches be synchronous, and then call them from within the outer async like that. Then the inner async won't get called until each the download is finished.

plasticbugs
Dec 13, 2006

Special Batman and Robin

Carthag posted:

Just a tip, you can use code tags, makes it easier to read:

Objective-C code:
dispatch_async(queue, ^{for item in arrayOfItems {
  [item doAwesomeCoolAsynchronousMethodOnABackgroundThreadOnEachItem]
    dispatch_async(dispatch_get_main_queue(), ^{
      [do something after each item loads with my mbprogress
hud to update progress loading animation on the main thread];
    });
  }
}
But I would probably have the actual S3 fetches be synchronous, and then call them from within the outer async like that. Then the inner async won't get called until each the download is finished.

Won't that block the main thread, causing the UI to lock up as each item is downloaded? This is all very new to me. Everything I know about GCD I learned from the CS193p Stanford class on iTunes U.

Carthag Tuek
Oct 15, 2005

Tider skal komme,
tider skal henrulle,
slægt skal følge slægters gang



plasticbugs posted:

Won't that block the main thread, causing the UI to lock up as each item is downloaded? This is all very new to me. Everything I know about GCD I learned from the CS193p Stanford class on iTunes U.

You're right that doing UI updates from off the main thread is a bad idea.

I generally do a variation of this when I have a long queue of things that I want to process in the background:

Objective-C code:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void) {
    dispatch_async(dispatch_get_main_queue(), ^{
      // tell UI we're starting (show progress bar or whatever)
    });
    for (int i = 0; i < n; i++) { //or for (id obj in collection) etc
        // do heavy lifting here
        dispatch_async(dispatch_get_main_queue(), ^{
            // tell UI we're at number i
        });
    }
    dispatch_async(dispatch_get_main_queue(), ^{
      // tell UI we're done (hide progress bar)
    });
});
That's the gist of it. My UI calls are delegate methods (will/did) so the code above doesn't know anything about the UI, it just says to the controller: "hey, we're at item #5" now and the controller takes care of updating the UI.

E: The important thing I guess is to wrap UI updates in the async/main_queue thing when you're working off-main.

E2: VVV Doy. Fixed! Thanks pokeyman. So it goes when cutting & pasting and replacing with comments :downs:

E3: There, that looks better. It's 10 pm, no more writing objc in a webform for me today!

Carthag Tuek fucked around with this message at 21:48 on Mar 21, 2013

pokeyman
Nov 26, 2006

That elephant ate my entire platoon.
edit: fixed above

pokeyman fucked around with this message at 02:12 on Mar 22, 2013

Soup in a Bag
Dec 4, 2009
Can somebody help me make sure I've got a halfway sane plan please? I'm converting a sort of finished AppleScript project to an Objective-C app to help me learn Obj-C/OS X programming. It's a simple developer tool for processing clipboard text with Ruby. When launched it prompts the user for a line of Ruby code which is run on the clipboard contents. The output is then copied back to the clipboard.

Right now this is done via the shell, pbpaste, pbcopy, and ruby. In moving to Objective-C, apart from using NSPasteboard, I want to embed the ruby interpreter (written in C). Communicating with the interpreter is what I'm least sure of how to approach.

From what I've read, I think I should be looking at newer technologies like GCD or XPC (via NSXPCConnection) rather than just threads. GCD seems like it might be the quicker/easier route, but also more limited. When embedding ruby, there is some setup involved. Am I correct in thinking that GCD would require doing the setup on every call to ruby? With the interpreter as an XPC service, I'd have a background process running where I could do the ruby setup once and then wait to hear from the main application. An XPC service would also allow for sandboxing and a more plugin-like architecture which might be good if I want to add something in addition to Ruby in the future.

Am I basically headed the right direction? Any recommendations or other advice?

pokeyman
Nov 26, 2006

That elephant ate my entire platoon.
Wrap the "Ruby interpreter" into an object with a simple interface. Then, to get started, implement it by simply shelling out to the installed ruby. Once that works, you can work on compiling the interpreter yourself.

Objective-C code:
@interface RubyInterpreter

- (NSString *)executeScript:(NSString *)script
                 withString:(NSString *)clipboardContentsOrWhatever;

@end
Once you have that working, it shouldn't be hard to implement a RubyInterpreter with a dispatch queue, or as an XPC service.

plasticbugs
Dec 13, 2006

Special Batman and Robin

Carthag posted:

You're right that doing UI updates from off the main thread is a bad idea.

I generally do a variation of this when I have a long queue of things that I want to process in the background:

Objective-C code:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void) {
    dispatch_async(dispatch_get_main_queue(), ^{
      // tell UI we're starting (show progress bar or whatever)
    });
    for (int i = 0; i < n; i++) { //or for (id obj in collection) etc
        // do heavy lifting here
        dispatch_async(dispatch_get_main_queue(), ^{
            // tell UI we're at number i
        });
    }
    dispatch_async(dispatch_get_main_queue(), ^{
      // tell UI we're done (hide progress bar)
    });
});

That's virtually what my code looks like, except I'm working with my document's managed object context, which I understand was created on the main thread. Is that what's screwing me up? Can I not save objects to core data in a background thread this way? Thanks for the help.

Here's my actual code:
Objective-C code:
-(void)fetchGameDataIntoDocument:(UIManagedDocument *) document {
    
    NSString *url = self.URL;
    // If there's no HUD, set up an indeterminate hud and display it
    if (!_hud) {
        _hud = [[MBProgressHUD alloc] initWithView:self.view];
        _hud.mode = MBProgressHUDModeIndeterminate;
        _hud.labelText = @"Connecting...";
        [self.view addSubview:_hud];
    }
    [_hud show:YES];

    // Fetch JSON data on a background queue
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void) {
        NSArray *games = [Game getJSONData:url];
        
        // Jump back to the main queue and update the HUD to begin loading data
        dispatch_async(dispatch_get_main_queue(), ^{
            NSLog(@"FINISHED JSON GET");
            _hud.mode = MBProgressHUDModeDeterminate;
            _hud.labelText = @"Loading...";
        });
        
        // Save each game object in my JSON array to Core Data
        [document.managedObjectContext performBlock:^{
            int currentRecord = 0;

            for (NSDictionary *gameInfo in games) {
                NSNumber *gamesCount = [NSNumber numberWithInteger:[games count]];
                currentRecord++;
                // Get the current percent of data loaded for the HUD
                float percent = (float)currentRecord/[gamesCount floatValue];
                
                // Check if game from JSON data exists in the DB. If not, create it.
                [Game gameWithRemoteAppInfo:gameInfo inManagedObjectContext:document.managedObjectContext];
                
                // Jump back to main queue to update the HUD to show progress
                dispatch_async(dispatch_get_main_queue(), ^{
                    [_hud setProgress: percent];
                    NSLog(@"progress: %f", percent);
                });
                NSLog(@"Current Record:%d", currentRecord);
                

            }
            
            dispatch_async(dispatch_get_main_queue(), ^{
                // Clean up deleted games from Database
                if ([self.fetchedResultsController.fetchedObjects count] != [games count]) {
                    [Game deleteDBObjectsNoLongerOnServerWithFetchedResultsController:self.fetchedResultsController
		    andGames:games inManagedObjectContext:document.managedObjectContext];
                }
                // Hide HUD and re-display the "Refresh" button
                [MBProgressHUD hideHUDForView:self.view animated:YES];
                self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc]
		initWithTitle:@"Refresh" style:UIBarButtonItemStylePlain target:self action:@selector(refresh:)];
                
            });
        }];
        
    });

    
}

Jam2
Jan 15, 2008

With Energy For Mayhem
Using the context outside of the thread where it was created is an immediate red flag.

You can use performBlock to let the system make sure your managedObjectContext is used on the "correct" thread.

Writing multithreaded behavior with the MOC requires some understanding. If you decide to look into it, please share. Otherwise, you will probably need to use it on the main thread.

code:
[document.context performBlock:^() {
  // use the context in here
  [Game gameWithRemoteAppInfo:gameInfo inManagedObjectContext:document.managedObjectContext];

}];

Jam2 fucked around with this message at 12:09 on Mar 22, 2013

Carthag Tuek
Oct 15, 2005

Tider skal komme,
tider skal henrulle,
slægt skal følge slægters gang



Another option is to create a child context and use that in the thread, then merge it back up into its parent when you're done. I think that's how it goes, haven't tried it myself.

Soup in a Bag
Dec 4, 2009

pokeyman posted:

Wrap the "Ruby interpreter" into an object with a simple interface. Then, to get started, implement it by simply shelling out to the installed ruby. Once that works, you can work on compiling the interpreter yourself.

Once you have that working, it shouldn't be hard to implement a RubyInterpreter with a dispatch queue, or as an XPC service.

I implemented an object that compiles/links ruby and then uses it via fork & pipes (though maybe I should have used NSTask). I just wanted to make sure I was right in thinking I should look at GCD or XPC for the actual application. From what I've read, the fork implementation won't be safe once I'm using Cocoa and other frameworks. I'm thinking I'll learn more from creating an XPC service so I'll probably go that route. Thanks.

HaB
Jan 5, 2001

What are the odds?
Is there some reason I am unable to find a clear example of retrieving the mobile number from an ABPersonRef?

Seems like that would be an extremely common task, but every example I've seen starts going a bunch of weird places I don't understand.

This can't be that complicated, right?

Simulated
Sep 28, 2001
Lowtax giveth, and Lowtax taketh away.
College Slice

Carthag posted:

Another option is to create a child context and use that in the thread, then merge it back up into its parent when you're done. I think that's how it goes, haven't tried it myself.

Yes; init the main context with the appropriate threading model, then the child MOC can be created (but only on the child thread!). When the child is "saved", it just forwards its changes on to the parent. I think I posted about this earlier in the thread but the pattern also works to allow easily discarding changes if the user cancels out of a screen.

The threading model of CoreData is... Non-intuitive, but Apple has made some improvements. I'm hoping they can make more as time goes on. Of course I wish iCloud CoreData was worth using too so YMMV.


Pro-tip: don't use iCloud CoreData. You'll regret it.

Axiem
Oct 19, 2005

I want to leave my mind blank, but I'm terrified of what will happen if I do
In the past, I've gotten a decent amount of experience with RAD (thus, Eclipse) under my belt with a fair amount of Java/C/Perl coding. Now I'm tooling around with Xcode, and there are a few things about RAD that I'm trying to figure out how to do in Xcode, or if Xcode can do them at all. Overall, I'm rather happy with Xcode, though; it seems like a good IDE.

The first and biggest is in RAD, when I mouse over a method or a variable, it'll give me a tooltip of comments for it. I know about holding alt for methods in Xcode, but that only seems to work with Apple-provided stuff, not my own. Is there a special comments format I'm missing or something? Or does Xcode just not do this--and if not, any particular reason?

Another small thing in RAD is that if I'm typing away at a method and happen to refer to a class that I haven't yet imported, when I mouse over the class name (which has a warning on it), it's smart enough to know that the class is either one in my project or a standard Java one, and give me the option to just put the import in for me--or create a new class with that name. It also has some of these smarts with methods and variables. So far, I haven't figured out a way to do this sort of automation in Xcode, or is it just not there yet?

Also, with RAD if I have something selected, I can hit F3 and it'll pop over to the definition of that method/variable, which is really useful for tracing through code. Is there an equivalent shortcut key in Xcode? (I've looked through the menus to no avail)

The last little thing is that with block comments, if I start a line with my /* and hit enter, it automatically builds the block for me:
code:
/*
 *
 */
Is there any way I can get Xcode to do this?


And lest people thing I'm berating Xcode, I will say I really do like it as an IDE. The autocomplete is so much better than RAD's in my opinion, and the way its logging works is pretty slick. I really am enjoying it, there's just a few environment things that have been a little jarring.

haveblue
Aug 15, 2005



Toilet Rascal

Axiem posted:

Also, with RAD if I have something selected, I can hit F3 and it'll pop over to the definition of that method/variable, which is really useful for tracing through code. Is there an equivalent shortcut key in Xcode? (I've looked through the menus to no avail)

Command-click on the method/variable (or class/type).

pokeyman
Nov 26, 2006

That elephant ate my entire platoon.

Axiem posted:

The first and biggest is in RAD, when I mouse over a method or a variable, it'll give me a tooltip of comments for it. I know about holding alt for methods in Xcode, but that only seems to work with Apple-provided stuff, not my own. Is there a special comments format I'm missing or something? Or does Xcode just not do this--and if not, any particular reason?

I've never seen Xcode do this. My understanding is this info comes from installed documentation. You can add other documentation (some third-party libraries do this) in the Preferences, under Downloads then Documentation.

quote:

the option to just put the import in for me--or create a new class with that name. It also has some of these smarts with methods and variables. So far, I haven't figured out a way to do this sort of automation in Xcode, or is it just not there yet?

Haven't seen Xcode do this either.

quote:

The last little thing is that with block comments, if I start a line with my /* and hit enter, it automatically builds the block for me:
code:
/*
 *
 */
Is there any way I can get Xcode to do this?

Again, haven't seen it.

quote:

And lest people thing I'm berating Xcode, I will say I really do like it as an IDE. The autocomplete is so much better than RAD's in my opinion, and the way its logging works is pretty slick. I really am enjoying it, there's just a few environment things that have been a little jarring.

This is certainly higher praise than Xcode tends to get.

There are unofficial Xcode plugins if you search around. I haven't come across any that fix your specific problems, but a) I haven't looked very hard for plugins in general and b) maybe you can hack one up. I've seen a few on GitHub at least.

If you're looking for alternative Objective-C IDEs for Apple stuff, the only real contender I'm aware of JetBrains's AppCode. If you get sour on Xcode, have a look.

Carthag Tuek
Oct 15, 2005

Tider skal komme,
tider skal henrulle,
slægt skal følge slægters gang



You can open the inspector tab or whatever, and click a thing, and the tab will show you the definition if you have it in your docs.

I dunno, XCode is kindof a mess. 3 wasn't so hot, but they took out a lot of stuff to make 4, and are bringing it back piecemeal.

Axiem
Oct 19, 2005

I want to leave my mind blank, but I'm terrified of what will happen if I do

gooby on rails posted:

Command-click on the method/variable (or class/type).

Awesome! That's what I was looking for. Thanks.

Carthag posted:

You can open the inspector tab or whatever, and click a thing, and the tab will show you the definition if you have it in your docs.

Ah, I hadn't noticed that because I'm on a tiny-rear end screen so I leave the right sidebar off. That's good to know, though it also seems to have the limitation of only going with the official documentation :(

pokeyman posted:

I've never seen Xcode do this.

quote:

Haven't seen Xcode do this either.

quote:

Again, haven't seen it.

That's what I was afraid of. It'll take a while to get used to, I guess.


quote:

There are unofficial Xcode plugins if you search around. I haven't come across any that fix your specific problems, but a) I haven't looked very hard for plugins in general and b) maybe you can hack one up. I've seen a few on GitHub at least.

If you're looking for alternative Objective-C IDEs for Apple stuff, the only real contender I'm aware of JetBrains's AppCode. If you get sour on Xcode, have a look.

Cool, I didn't know about the plugins thing (though in retrospect, that makes sense). I'll have to dig a little to see if I find anything that does what I want. Though I might look into writing one or two myself, if it's not too difficult.

Why do people get so down on Xcode? It seems like a pretty good IDE.

haveblue
Aug 15, 2005



Toilet Rascal
Mostly because they're comparing it to Visual Studio. It's a very Apple product- if you're doing it their way, it's like a dream, but if you're trying to adapt it to your way you constantly run into pitfalls and frustrations. I still miss multiple window mode.

Jam2
Jan 15, 2008

With Energy For Mayhem
How is XCode's built-in unit testing framework?

Doctor w-rw-rw-
Jun 24, 2008

Axiem posted:

Why do people get so down on Xcode? It seems like a pretty good IDE.

It's also way worse than it used to be, in a couple of respects, IMO. Crash-happy and chugs with Interface Builder integrated in. Thanks to LLVM, though, much better autocomplete, though.

pokeyman
Nov 26, 2006

That elephant ate my entire platoon.

Jam2 posted:

How is XCode's built-in unit testing framework?

Entirely adequate.

pokeyman
Nov 26, 2006

That elephant ate my entire platoon.

Axiem posted:

Why do people get so down on Xcode? It seems like a pretty good IDE.

I'm not sure, it seems to have trailed off around Xcode 4.

Legitimate grievances, I mean. There's never a shortage of opinion or unhelpful comparisons.

ManicJason
Oct 27, 2003

He doesn't really stop the puck, but he scares the hell out of the other team.
Most of my bitching has moved from Xcode in general to just LLDB. It was doing pretty well in the second to last release, but now it frequently decides to freeze for 2+ minutes at a time if you so much as look at the interactive console. I also have to run fuxcode at least three times a day in the latest release to unbreak something, usually Xcode refusing to copy nibs or pngs to the bundle.

It just wouldn't be Xcode if some feature wasn't completely broken in each release.

Toady
Jan 12, 2009

I'm pretty satisfied with it. I just realized that I've only had one crash in recent memory. There was a time I could consistently make it crash, usually in IB.

I wish Xcode automated some common advanced tasks, such as creating a framework for embedding in the app--I never remember the build settings I need to configure--or sharing a group among multiple projects in a workspace. Feature requests already filed (and determined to be dupes).

Doc Block
Apr 15, 2003
Fun Shoe
I almost never have problems with Xcode, but then again I don't do anything too weird with my build settings and I don't try to make Xcode behave like other IDEs.

My Mac also has 8GB RAM, which helps with memory hogs like Xcode. Some people apparently stuck with the base 2 or 4GB configurations when getting their Macs.

I do run Build Clean, close Xcode, run fuxcode, then reopen Xcode before doing an App Store build, though. Just In Case.

lord funk
Feb 16, 2004

TC-11 update is done (w0000000t). Now time to press (Choose File...) 60 times on iTunes Connect to upload the new screenshots! :suicide:

Simulated
Sep 28, 2001
Lowtax giveth, and Lowtax taketh away.
College Slice

lord funk posted:

TC-11 update is done (w0000000t). Now time to press (Choose File...) 60 times on iTunes Connect to upload the new screenshots! :suicide:

180 screenshots here my friend; I feel your pain and then some.

Glimm
Jul 27, 2005

Time is only gonna pass you by

Ender.uNF posted:

180 screenshots here my friend; I feel your pain and then some.

This is so frustrating. If the only thing announced at WWDC is that iTunes Connect has been made sensible it will be the best WWDC of all time.

eschaton
Mar 7, 2007

Don't you just hate when you wind up in a store with people who are in a socioeconomic class that is pretty obviously about two levels lower than your own?

Ender.uNF posted:

Yes; init the main context with the appropriate threading model, then the child MOC can be created (but only on the child thread!). When the child is "saved", it just forwards its changes on to the parent.

If you use the appropriate threading model — private queue concurrency — when you create an NSManagedObjectContext, you don't need to worry about which thread you create it on.

The general pattern to use is to have a "primary" context initialized with private queue concurrency, then to have one or more child contexts using main queue concurrency for your UI.

That way you can do saves, fetches, etc. from your persistent store without blocking your UI easily. You can also have one (or more) child contexts using private queue concurrency for other purposes, such as synchronizing with a web service; again, this lets you do much of the work without blocking either the UI or interaction with your persistent store.

One caveat is that before saving changes in a child store, you'll want to obtain permanent IDs for any inserted objects. That way you won't have to do your own temporary-to-permanent-ID mapping when propagating changes between parts of your app. That's one trivial pair of methods on the context though, in advance of the save.

eschaton
Mar 7, 2007

Don't you just hate when you wind up in a store with people who are in a socioeconomic class that is pretty obviously about two levels lower than your own?

rjmccall posted:

It's definitely a bug; thanks for the report.

Indeed!

(Also, there's always the implicit "just because someone works at a company doesn't mean they speak for that company" disclaimer.)

lord funk
Feb 16, 2004

Ender.uNF posted:

180 screenshots here my friend; I feel your pain and then some.

At the very least it would be great if you could shift-click multiple files to upload. Or not have to wait while the thumbnail is generated.

But yeah, at least it isn't a universal app.

Fate Accomplice
Nov 30, 2006




I've got a question about scrollViews, paging, and outlets.

I'm making an app that allows the user to page back and forth between screens. Each screen contains the same fields, currently some labels.

in the view controller that's holding the uiscrollview, I want to be able to access the screen currently showing's IBOutlets, then when a new screen is paged out, the VC's connections are updated to the new screen's. How do I do that?

haveblue
Aug 15, 2005



Toilet Rascal
Make the VC the owner of a newly loaded copy of the nib? The load process should remake all the connections once you drop the old screen.

dizzywhip
Dec 23, 2005

Aaand it's finally out! It's a relief to finally see it up on the app store after waiting for so long.

Doc Block
Apr 15, 2003
Fun Shoe
Congrats! Also, you got mentioned on The Loop so hopefully that will give you a lot of sales.

ultramiraculous
Nov 12, 2003

"No..."
Grimey Drawer

Gordon Cole posted:

Aaand it's finally out! It's a relief to finally see it up on the app store after waiting for so long.

Man, that really confused me for a second. I thought Chromatik had some dark horse spinoff product, but then I remembered they had a 'k' at the end of their name.

Also that app looks pretty slick. Nice work!

Adbot
ADBOT LOVES YOU

dizzywhip
Dec 23, 2005

Doc Block posted:

Congrats! Also, you got mentioned on The Loop so hopefully that will give you a lot of sales.

Thanks! I just saw that...it seems like it's getting a pretty good response so far. I've been trying to get coverage from blogs but haven't gotten much of a response from them so far unfortunately. It seems pretty tough to market an app as a new developer.

ultramiraculous posted:

Man, that really confused me for a second. I thought Chromatik had some dark horse spinoff product, but then I remembered they had a 'k' at the end of their name.

Whoa...weird. I suppose I have "Labs" at the end of my name as well so the name's at least not identical. The similarity is kind of unfortunate though.

  • 1
  • 2
  • 3
  • 4
  • 5
  • Post
  • Reply