2015-05-03 3 views
1

СЦЕНАРИЙCasting потерпел неудачу, может быть связано с указателем

сценарий состоит в 2-х классов операций и места

эти 2 класса связаны, как описано ниже

Operation{ 
    storedAt : Date 
    type -> OperationType (Pointer) 
    place -> Places (Pointer) 
} 

Places { 
    title : String 
    type -> OperationType (Pointer) 
    location -> PFGeoPoint 
} 

, что я бы делать это просто чтобы найти места рядом с пользователем. Для этого я использовал:

func getNearPlaces(location: CLLocation){ 
    if location.isZero() { 
     return 
    } 

    var placeQuery = PFQuery(className: "Places") 
    println("getNearPlaces location \(location)") 
    placeQuery.whereKey("location", nearGeoPoint: PFGeoPoint(location:location), withinKilometers: 2) 
    placeQuery.whereKey("type", equalTo: detailItem.type) 
    placeQuery.limit = 15 

    placeQuery.findObjectsInBackgroundWithBlock { (objects:[AnyObject]?, error:NSError?) -> Void in 
     if error != nil { 
      println("error: \(error)") 
      return 
     } 

     println("results: \(objects?.count)") 
     if let objs = objects as? [PFObject] { 
      println("casting to [PFObject] ok") 
     } 

     if let objs = objects as? [Places] { 
      println("casting to [Places] ok") 
       self.places = objs 
     } 
     self.updateLocationOnMap() 
    } 
} 

где detailItem подкласс операций

Теперь точка! Если класс Operations имеет NO место указателя столбца, оцененного по классу для всех строк, все работает нормально.

results: Optional(3) 
casting to [PFObject] ok 
casting to [Places] ok 

Далее я назначил detailItem.place одним из значений [Места], и я продолжаю использовать приложение. И все в порядке.

, когда я снова начать приложение и detailItem.place является индексируются, это выход у меня есть:

results: Optional(3) 
casting to [PFObject] ok 

литье в [Места] не удалось

может кто-нибудь объяснить мне, почему? это что-то связанное с разным или быстрым? есть ли что-то, что я делаю неправильно?

добавить некоторые детали больше:

В соответствии с тем, как определено на Parse.com Doc:

class Places:PFObject,PFSubclassing{ 

override class func initialize() { 
    struct Static { 
     static var onceToken : dispatch_once_t = 0; 
    } 
    dispatch_once(&Static.onceToken) { 
     self.registerSubclass() 
    } 
} 

static func parseClassName() -> String { 
    return "Places" 
} 

@NSManaged var title:String 
@NSManaged var type:OperationsType 
@NSManaged var location:PFGeoPoint 

} 

ниже выхода из объектов, извлеченных из PFQuery описано выше:

[<Places: 0x7fb94dc9e9d0, objectId: yFDNHinajo, localId: (null)> 
{ 
    location = "<PFGeoPoint: 0x7fb94d587ad0, latitude: 95.497511, longitude: 19.224867>"; 
    title = tamoilled; 
    type = "<OperationsType: 0x7fb94844a2f0, objectId: 2IPOWNo1lM>"; 
}, 
<Places: 0x7fb94a84b2f0, objectId: zlh3CMVu0t, localId: (null)> 
{ 
    location = "<PFGeoPoint: 0x7fb94dc63f20, latitude: 95.498064, longitude: 19.226219>"; 
    title = "new Place"; 
    type = "<OperationsType: 0x7fb94844a2f0, objectId: 2IPOWNo1lM>"; 
}, 
<Places: 0x7fb94dc9f8f0, objectId: ymY7SlA3Is, localId: (null)> 
{ 
    location = "<PFGeoPoint: 0x7fb94dce4e70, latitude: 95.510635, longitude: 19.217392>"; 
    title = "Agip 2"; 
    type = "<OperationsType: 0x7fb94844a2f0, objectId: 2IPOWNo1lM>"; 
}] 

Parse iOS sdk 1.7.2, Xcode 6.3.1

сверху сделалFinishLaunchingWi thOptions

ParseCrashReporting.enable(); 
Parse.enableLocalDatastore() 
Parse.setApplicationId("...", clientKey:"..."); 

UPDATE

Я заменил

println("results: \(objects?.count)") 
if let objs = objects as? [PFObject] { 
    println("casting to [PFObjects] ok \(objs)") 
} 

с

self.places = [] 
for result in objects! { 
    println("object \(result)") 
    if let place = result as? Places { 
     println("place ok") 
     self.places.append(place) 
    } 
} 

и результат в том, что места объекта не соответствующая detailItem.place является не отливают к Места, даже если это кажется правильным! (сосредоточьтесь на первом словаре.это не «место» ОК)

object <Places: 0x7ff5a0f64be0, objectId: yFDNHinajo, localId: (null)> { 
location = "<PFGeoPoint: 0x7ff5a312c720, latitude: 95.497511, longitude: 19.224867>"; 
title = tamoilled; 
type = "<OperationsType: 0x7ff5a0edd520, objectId: 2IPOWNo1lM>"; 
} 
object <Places: 0x7ff5a0fbcdc0, objectId: zlh3CMVu0t, localId: (null)> { 
location = "<PFGeoPoint: 0x7ff5a3121f30, latitude: 95.498064, longitude: 19.226219>"; 
title = "new Place"; 
type = "<OperationsType: 0x7ff5a0edd520, objectId: 2IPOWNo1lM>"; 
} 
place ok 
object <Places: 0x7ff5a3724320, objectId: ymY7SlA3Is, localId: (null)> { 
location = "<PFGeoPoint: 0x7ff5a31b8450, latitude: 95.510635, longitude: 19.217392>"; 
title = "Agip 2"; 
type = "<OperationsType: 0x7ff5a0edd520, objectId: 2IPOWNo1lM>"; 
} 
place ok 

UPDATE 2

Я попытался выполнить тот же запрос, при запуске приложения. нет ошибок и отливок отлично работает У меня больше нет ресурсов прямо сейчас. Я думаю, что это может быть ошибка, исходящая из рамки Parse.com. Или что-то я не знаю, по моему сценарию (который должен быть очень простым)

+0

Может ли кто-нибудь поддержать меня? – tylyo

+0

Вы должны добавить свой ответ в блок ответа, а не как отредактировать вопрос. Тогда примите свой ответ. – jww

ответ

1

решаемых

с обновлением нового Parse, они предлагают добавить явным

Places.registerSubclass() 

перед тем

Parse.setApplicationId()