我正在使用Photos框架(又名PhotoKit).在我的应用程序中,我需要收集Moments(属于类型PHAssetCollection).PHAssetCollection有一个属性CLLocation *approximateLocation.
但是NSPredicate当我从PhotoKit检索Moments时,我无法工作.
-(void)getMomentsNearCoordinate:(CLLocationCoordinate2D)coordinate completionBlock:(PKAssetManagerArrayBlock)completionBlock{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
PHFetchOptions *options = [[PHFetchOptions alloc] init];
options.predicate = [NSPredicate predicateWithFormat:@"approximateLocation.coordinate.latitude < 37.0"];
self.moments = [PHAssetCollection fetchMomentsWithOptions:options];
// Convert PHCollection into NSArray
NSMutableArray *momentsArray = [[NSMutableArray alloc]initWithCapacity:self.moments.count];
[self.moments enumerateObjectsUsingBlock:^(PHAssetCollection *moment, NSUInteger idx, BOOL *stop) {
[momentsArray addObject:moment];
}];
dispatch_async(dispatch_get_main_queue(), ^{
completionBlock([NSArray arrayWithArray:momentsArray]);
});
});
}
Run Code Online (Sandbox Code Playgroud)
调试器将停止运行
self.moments = [PHAssetCollection fetchMomentsWithOptions:options];
Run Code Online (Sandbox Code Playgroud)
有错误:
***由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'获取选项中不支持的谓词:approximateLocation.coordinate.latitude <37'
这似乎很奇怪,因为我可以使用或NSPredicate过滤.startDateendDate
无论如何,接下来我以为我会尝试使用NSPredicatewith块:
-(void)getMomentsNearCoordinate:(CLLocationCoordinate2D)coordinate completionBlock:(PKAssetManagerArrayBlock)completionBlock{ …Run Code Online (Sandbox Code Playgroud) 使用CloudKit CKQuery,您可以过滤距离(参见示例).但你怎么能对距离进行排序呢?喜欢位置ASC.位置上的排序描述符返回错误query.sortDescriptors = [NSSortDescriptor(key: "distanceToLocation", ascending: true)]:
static func getNearbySpots(location : CLLocation, completionHandler: (spots : CKRecord[]) -> Void) {
let predicate = NSPredicate(format: "distanceToLocation:fromLocation:(location, %@) < 10000", location)
let queryOperation = CKQueryOperation(query: query)
var results : CKRecord[] = []
queryOperation.recordFetchedBlock = {
results += $0
}
queryOperation.queryCompletionBlock = {
if $1 {
NSLog($1.description,[])
abort()
} else {
completionHandler(spots: results)
}
}
self.publicDB().addOperation(queryOperation)
}
Run Code Online (Sandbox Code Playgroud) 我尝试为此使用 CKQueryOperation:
CKQueryOperation *o = [[CKQueryOperation alloc] initWithQuery:query];
[o setDesiredKeys:@[]];
Run Code Online (Sandbox Code Playgroud)
但它仍然返回了很多我此时不需要的数据
<CKRecord: 0x79881a50; recordType=Comment, recordID=CBB7B269-47AH-406E-8934-682D31501778:(_defaultZone:__defaultOwner__), recordChangeTag=i1x8j1ey, values={
}>
{
creatorUserRecordID -> <CKRecordID: 0x7966e9d0; _e5b178bde573ba6fee336b9ed8:(_defaultZone:__defaultOwner__)>
lastModifiedUserRecordID -> <CKRecordID: 0x7966cdd0; _e5b178bd3e9e7a6e336b9f34ed8:(_defaultZone:__defaultOwner__)>
creationDate -> 2014-10-31 07:20:45 +0000
modificationDate -> 2014-10-31 07:20:45 +0000
modifiedByDevice -> iPhone Simulator
}
Run Code Online (Sandbox Code Playgroud)
我只需要一个记录计数。
我在 CloudKit 中保存了图像作为资产。每个记录还有其他属性。我可以收集记录并使用其他属性,但我无法在我的 ImageView 中使用资产。我是 Swift 编程的新手,因此我收到的错误没有任何意义。
let container = CKContainer.default()
let publicDB = container.publicCloudDatabase
let query1 = CKQuery(recordType: "movieArray", predicate: predicate2)
publicDB.perform(query1, inZoneWith: nil) {(results:[CKRecord]?, error:Error?) in
if error != nil {
DispatchQueue.main.async {
print("Cloud Query Error - Fetch Establishments: \(String(describing: error))")
}
return
}
for record in results! {
DispatchQueue.main.async {
let asset = record["myImageKey"] as? CKAsset
let data = NSData(contentsOf: (asset?.fileURL)!)
let image = UIImage(data: data! as Data)
print("Test")
self.detailImage.image = image
}
self.movieCast.text = record.object(forKey: "Actors") …Run Code Online (Sandbox Code Playgroud) 在Apple审核期间,只有一次error 1298: This operation has been rate limited下载记录时CKQueryOperation,客户端收到来自CloudKit的错误.我该如何解决这个问题?
这是代码,没什么特别的:
let query = CKQuery(recordType: "Movie", predicate: NSPredicate(format: "creationDate > %@", d!))
let qo = CKQueryOperation(query: query)
let fb: (CKRecord!) -> () = {record in
temporaryContext.performBlockAndWait({
let fr = NSFetchRequest(entityName: "Movie")
fr.predicate = NSPredicate(format: "recordName = %@", record.recordID.recordName)
let a = temporaryContext.executeFetchRequest(fr, error: nil) as! [Movie]
if a.count == 0 {
let m = NSEntityDescription.insertNewObjectForEntityForName("Movie", inManagedObjectContext: temporaryContext) as! Movie
m.title = record.valueForKey("title") as! String
m.image = (record.valueForKey("image") as! …Run Code Online (Sandbox Code Playgroud) 我正在createdAt像这样对系统字段进行排序:
query.sortDescriptors = [NSSortDescriptor(key: "createdAt", ascending: false)]
Run Code Online (Sandbox Code Playgroud)
并得到以下错误:
CKError 0x1c4447fb0:“无效的参数”(12/2018); 服务器消息=“未知字段'createdAt'”;uuid = 9C450848-2449-4892-93BC-C46363203042; 容器ID =“ ...
我可以查询和排序以这种方式创建的字段。与系统字段有什么不同?该字段的索引是可排序和可查询的。
在swift 2.3中,我编写了一个函数,它将日期转换为6-01-16,将其转换为NSDate,然后在CKQuery中使用它.我不知道如何为Swift 3更新这个.
这是我目前的代码:
let formatter = DateFormatter()
formatter.dateFormat = "yyyymmdd"
let olddate = formatter.date(from: "20160601")
print(olddate)
Run Code Online (Sandbox Code Playgroud)
这不起作用,我该如何更改语法?