Xcode playgrounds are a delightful way to explore the Swift language — once you get them set up. I admit that I’ve grown to love environments where I can code with simple text files, however, I also love to develop iOS apps and so I find myself digging once again thru the byzantine Xcode GUI. It seems I always forget the magic incantations!
Here are the notes for my future self and other intrepid explorers:
Experimenting with Parse.com in Swift 2, Xcode 7.2, OSX 10.10.5 (Yosemite)
note: cocoapods 0.39.0 has issue with Ruby 2.3 (https://github.com/CocoaPods/CocoaPods/issues/4345) — likely fixed in the 1.0 beta, but I stuck with older ruby and released cocoapod for this exercise.
rvm use ruby-2.2.4
gem install cocoapods
Make a new Xcode project, and add a new Empty file to your project called Podfile (New > File… > Other > Empty), with the following contents:
platform :ios, '8.1'
xcodeproj 'ParsePlayground'
use_frameworks!
target :ParsePlayground, :exclusive => true do
pod 'Parse'
end
back on the command-line:
pod install
This creates a new Xcode workspace, so we need to close the project in Xcode, then re-open Xcode with the file named something ending in .xcworkspace.
This new workspace should have both the original project and a new one called Pods. Now we can create the Playground, by selecting the menu: File > New > Playground… Then we save it in the root of our project directory, then add it to the project with the menu: File > Add Files To “ParsePlayground”
Now this code should compile:
import Parse
import XCPlayground
XCPlaygroundPage.currentPage.needsIndefiniteExecution = true
We want to set needsIndefiniteExecution so that the async commands will work.
I made a new Parse app to experiment, then in the parse docs, in the QuickStart Guide, they set up some sample code already customized with the app ID and client key, it should be something like:
Parse.setApplicationId("abunchofnumbersandletters",
clientKey: "morelettersandnumbers")
Then we can start coding! I made an item class in Parse with a string property “info.” Here some code that worked for me:
let testObject = PFObject(className: "TestObject")
testObject["foo"] = "bar"
testObject.saveInBackgroundWithBlock { (success: Bool, error: NSError?) -> Void in
print("Object has been saved: (success)")
}
var query = PFQuery(className: "item")
var items = try query.findObjects()
print("got some items")
for item in items {
var info = item["info"]
print(" item #(item.objectId!) info:(info)")
}
print("not the end... wait for the sync call to finish")
When I run the above code it works fine, but I do get some of the following errors. Not sure why…
Failed to obtain sandbox extension for path=/var/folders/hz/vnvkxt7x4236fp6nqt5zy2wr0000gn/T/com.apple.dt.Xcode.pg/containers/com.apple.dt.playground.stub.iOS_Simulator.experiment-3C8D4B75-8EA0-4BE8-8467-1B06C9B1F881/Library/Caches
I’ve posted the full ParsePlayground project on Github with some notes on how to set up the Parse app if you want to jump right in!
I tried it step-by-step and I get a “No such module ‘Parse'” error when I try to include Parse. I even downloaded your playground and got the same results.
I’ve been screwing around with trying to get CocoaPods working in playgrounds for a few hours now and have yet to make it work. I was hoping one last attempt using your excellent, detailed, process would work.
It is driving me crazy, but I think I am going to give up for a bit and work on some code so I at least feel productive.
I am running Xcode v7.2(7C68) on El Capitan v10.11.2 if that helps at all.
I’m sure it is something stupidly simple, I just haven’t figured it out yet.
Thanks for your article though!