注意:
这只是一个概念验证。
真正的后台任务是不断请求原始数据的“HTTP Get”并通过主线程显示;一经请求。
场景:
1)按需切换后台任务(循环)。
2) 后台任务在每次迭代时通知主线程 UI。
3) 只有一 (1) 个块操作在队列中运行。
Modus Operandus
1) 使用 NSBlockOperation 来包含后台代码。
2)使用区域BOOL来切换循环;通过 IBAction。
问题
1) 编译器将 BOOL 'isRunning' 标记为强链接:
在此块中强烈捕获“自我”可能会导致保留循环。
2)在尝试添加块操作之前,我检查了队列中是否有任何操作。
但我总是收到以下错误:
-[NSOperationQueue addOperation:]: 操作完成,不能入队
除了上述问题之外,这种概念验证似乎正在发挥作用。
问题:
1) 为什么编译将 BOOL 'running' 标记为一个强行,而它只是一个缩放器?
2)如果在队列中没有找到,为什么我不能通过添加另一个 NSBlockOperation 来重用 NSOperationQueue?
以下是整个代码:
#define START 0
#define STOP 1
@interface ricViewController ()
@property (assign) BOOL running;
@end
@implementation ricViewController {
NSOperationQueue *operationQueue;
NSBlockOperation *blockOperation;
void (^backgroundBlock)(void);
}
@synthesize running = isRunning;
#pragma mark - ViewController methods …Run Code Online (Sandbox Code Playgroud) 我想这是不可能从同一个Xcode,但通过多次打开Xcode?还是其他任何招数?我正在测试它们之间的CKSubscription和CloudKit通信.
我正在构建一个测试工具来验证CloudKit中的内容,但我希望能够选择容器的环境.
在iOS上,您可以在导出应用程序进行临时测试时选择"开发"或"生产"环境,但在OS X上没有该选项.它始终指向"开发"环境.
任何人都知道,如果在OS X或iOS上有一种以编程方式设置或选择要使用的容器环境的方法吗?
我很好奇是否有可能在不获取的情况下增加CKRecord变量中的字段值?因此,对于客户端,我对最近的值并不感到好奇,我只想增加任何值即可。原因是,操作应尽可能快速简便,而不是两个消息“流”,我只希望启动一个。
在大量搜索示例代码之后,管理好一起CKFetchRecordsOperation; 这是......但我一定错过了什么.不要误会我的意思......但......
要执行CKFetchRecordsOperation,您需要一个CKRecordIDs的NSArray; 要获得CKRecordIDs的NSArray,您需要执行CKQuery,您可以构建CKRecordIDs的NSArray.
但是等一下,提取CKRecordIDs的过程使用CKQuery,我可以直接下载CKRecords吗?
如果没有CKQuery,你如何获得CKRecordID的NSArray?
-(void)doSingleBeaconsDownload
{
CKDatabase *publicDatabase = [[CKContainer containerWithIdentifier:@"iCloud.cqd.ch.BeaconBrowser"] publicCloudDatabase];
NSPredicate *predicatex = [NSPredicate predicateWithFormat:@"iBeaconConfig = %@",iBeaconsConfirmed.giReferenceID];
CKQuery *query = [[CKQuery alloc] initWithRecordType:@"Running" predicate:predicatex];
[self.delegate performSelectorOnMainThread:@selector(processCompleted:) withObject:@"Downloading Configuration ..." waitUntilDone:YES];
[publicDatabase performQuery:query inZoneWithID:nil completionHandler:^(NSArray *results, NSError *error) {
if (error) {
NSLog(@"Batch Download Error iCloud error %@",error);
}
else {
NSMutableArray *rex2download = [[NSMutableArray alloc] init];
for (CKRecord *rex in results) {
[rex2download addObject:rex.recordID];
}
CKFetchRecordsOperation *fetchRecordsOperation = [[CKFetchRecordsOperation alloc] initWithRecordIDs:rex2download];
/* fetchRecordsOperation.perRecordCompletionBlock = ^(CKRecord *record, …Run Code Online (Sandbox Code Playgroud) 我正在创建一个cloudkit tableview.我加载应用程序,我的tableview显示我的云套件条目.
然后我使用我的add方法insertNewObject将记录添加到云套件中,但这不会显示在我的tableview中.它只会出现在我下次运行的应用程序中.
func insertNewObject(sender: AnyObject) {
let record = CKRecord(recordType: "CloudNote")
record.setObject("New Note", forKey: "Notes")
MyClipManager.SaveMethod(Database!, myRecord:record)
dispatch_async(dispatch_get_main_queue()) {
self.tableView.reloadData()
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的添加方法.我正在调用tableview重载,你可以看到,但什么也没发生.
我的tableview创建代码:
// Tableview stuff --- Done
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
/////// Get number of rows
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return objects.count
}
//// FIll the table
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) …Run Code Online (Sandbox Code Playgroud) 这是我的问题,我使用Parse解决方案构建了一个应用程序.在这个应用程序中,我使用了Parse的基本验证.在Parse死后,我需要迁移.
我想实现与CloudKit解决方案的验证,但我不知道这是一个很好的实践.我知道Cloudkit基本身份验证基于用户apple帐户.但我需要使用登录名/密码进行身份验证.
在Parse中没有类似"密码"的字段,所以我不知道如何以安全的方式在我的表中存储密码.而且我不确定在公共部分保存密码是否安全.
我想知道在CloudKit(登录/密码)中是否有良好的实践来实现基本身份验证?
在此先感谢您的帮助;)
PS:其他解决方案应该是移动到firebase,但我更喜欢CloudKit的逻辑.
我正在关注"CloudKit最佳实践"WWDC关于添加订阅的讨论,这似乎在iOS10中有所改变.
下面的代码返回'Success!',但是我的'AllChanges'订阅从未出现在CloudKit仪表板上的订阅类型中.
我在Xcode 8 beta 6上.
let subscription = CKDatabaseSubscription(subscriptionID:"AllChanges")
let notificationInfo = CKNotificationInfo()
notificationInfo.shouldSendContentAvailable = true
subscription.notificationInfo = notificationInfo
let operation = CKModifySubscriptionsOperation(subscriptionsToSave: [subscription], subscriptionIDsToDelete: [])
operation.modifySubscriptionsCompletionBlock = {
(modifiedSubscriptions: [CKSubscription]?, deletedSubscriptionIDs: [String]?, error: Error?) -> Void in
if error != nil {
print(error!.localizedDescription)
} else {
print("Success!")
}
}
operation.qualityOfService = .utility
privateDatabase.add(operation)
Run Code Online (Sandbox Code Playgroud) 我想在我的应用程序中放置出色的CloudKit错误处理,就像Apple希望我们这样做.我想立即保存和修改记录.这是我的基本保存逻辑......
func addNewRecord(managedObj: NSManagedObject) {
let newRec = managedObj.convertToCkRecord()
publicDB.saveRecord(newRec, completionHandler: saveHandler)
}
func saveHandler(savedRecord: CKRecord?, error: NSError?) {
// handle errors here
if let error = error {
if error.code == CKErrorCode.NotAuthenticated.rawValue {
// debug
print("Not authentricated")
}
else if error.code == CKErrorCode.NetworkFailure.rawValue {
print("Network failure!!")
if let retryAfterValue = error.userInfo[CKErrorRetryAfterKey] as? NSTimeInterval {
let delayTime = dispatch_time(DISPATCH_TIME_NOW, Int64(retryAfterValue * Double(NSEC_PER_SEC)))
dispatch_after(delayTime, dispatch_get_main_queue()) {
// THIS IS WHERE I GET STUCK, WHERE DO I FIND THE FAILED CKRECORD FOR …Run Code Online (Sandbox Code Playgroud) cloudkit ×10
ios ×9
objective-c ×3
swift ×3
ckrecord ×2
xcode ×2
debugging ×1
ios10 ×1
nserror ×1
nsoperation ×1
tableview ×1
uitableview ×1