小编Mis*_*Moo的帖子

Objective-C DRY JSON映射和对象创建

我试图将JSON信息动态映射到不同的对象.但是我无法弄清楚如何控制整个指针的情况,因为我希望它可以工作.

到目前为止,我的方法是为每个对象创建一个字典,将变量指针映射到等效的JSON键.在我的JSON映射器中,我有一个方法,parseJSONFromDictionary:withObject它应该迭代SBJSON的JSONValue 返回的字典,并将适当的值分配给给定对象中的相应变量.

-(NSObject *)parseJSONFromDictionary:(NSDictionary *)dict withObject:(NSObject *)start{
    for (NSString *key in dict) {
        if ([[self.mappings objectForKey:key] isMemberOfClass:[NSString class]]) {
            start.[self.mappings objectForKey:key] = [[dict valueForKey:key] stringValue];
        }
    }
    return start;
}
Run Code Online (Sandbox Code Playgroud)

mappings是包含变量和json键的字典,它dict是从json解析器返回的内容.

最大的问题是我做不到start.[self.mappings objectForKey:key].我对C知之甚少,显然我对指针知之甚少,那么我将如何创建这种系统呢?我知道这不是正确的方法,但正确的方法是什么?我知道它可以完成,正如RestKit所做的那样,但它们不支持OAuth,所以我很遗憾不能使用它们可爱的框架.

我之所以走这条路是因为我正在使用的API目前处于alpha阶段.我希望能够轻松适应任何未来的变化,而无需重写许多代码行.我也想开始编程DRY-ly.我知道JSON解析非常重复,我想找到一种方法来减少开销.

感谢您的帮助!


编辑:似乎对我要问的内容存在一些困惑.我并不需要帮助解析JSON.我已经在使用SBJSON了.我也不需要别人帮助的请求,我已经使用JDG的OAuthConsumer框架.我只能使用支持OAuth 2.0的框架.

我确实需要帮助弄清楚如何防止这种情况:

-(Class1 *)parseJsonForClass1:(NSString *)inputString {
    NSDictionary *outputDict = [inputString JSONValue];
    Class1 *instance1 = [self mapObjectsForClass1From:outputDict]; …
Run Code Online (Sandbox Code Playgroud)

iphone json dry objective-c ios

6
推荐指数
3
解决办法
5156
查看次数

SQLite3数据库实际上并没有插入数据 - iPhone

我正在尝试在我的数据库中添加一个新条目,但它不起作用.没有抛出错误,并且应该在插入运行后执行的代码,这意味着查询没有错误.但是,数据库中没有添加任何内容.我已经尝试了两个预处理语句和更简单的sqlite3_exec,结果相同.

我知道我的数据库正在加载,因为tableview(和后续的tableviews)的信息是从数据库加载的.连接不是问题.

此外,sqlite3_last_insert_rowid(db)的日志返回下一行的正确数字.但是,信息仍未保存.

这是我的代码:

db = [Database openDatabase];           
NSString *query = [NSString stringWithFormat:@"INSERT INTO lists (name) VALUES('%@')", newField.text];
NSLog(@"Query: %@",query);

sqlite3_stmt *statement;

if (sqlite3_prepare_v2(db, [query UTF8String], -1, &statement, nil) == SQLITE_OK) {
  if (sqlite3_step(statement) == SQLITE_DONE){
    NSLog(@"You created a new list!");
    int newListId = sqlite3_last_insert_rowid(db);
    MyList *newList = [[MyList alloc] initWithName:newField.text idNumber:[NSNumber numberWithInt:newListId]];
    [self.listArray addObject:newList];
    [newList release];
    [self.tableView reloadData];
    sqlite3_finalize(statement);
  }
  else {
    NSAssert1(0, @"Error while inserting data. '%s'", sqlite3_errmsg(db));
  }
}
[Database closeDatabase:db];
Run Code Online (Sandbox Code Playgroud)

同样,没有抛出任何错误.prepare和step语句分别返回SQLITE_OK和SQLITE_DONE,但没有任何反应.

任何帮助表示赞赏!

sqlite iphone objective-c

5
推荐指数
1
解决办法
5433
查看次数

核心数据返回NSArrays而不是NSStrings

由于某种原因,所有NSString类型的属性都在我的Article对象中作为NSArrays返回.这是我检索它们的功能:

- (NSArray *)getSavedArticles
{
    NSFetchRequest *fetchRequest = [[[NSFetchRequest alloc] init] autorelease];
    NSError *error = nil;
    NSEntityDescription *entity = [NSEntityDescription 
                                   entityForName:@"Article" inManagedObjectContext:[self managedObjectContext]];
    [fetchRequest setEntity:entity];
    NSSortDescriptor *dateSort = [NSSortDescriptor sortDescriptorWithKey:@"last_opened" ascending:NO];
    [fetchRequest setSortDescriptors:[NSArray arrayWithObject:dateSort]];
    NSArray *fetchedObjects = [[self managedObjectContext] executeFetchRequest:fetchRequest error:&error];
    return fetchedObjects;
}
Run Code Online (Sandbox Code Playgroud) 我没有为这些创建NSManagedObjectModel,而是我只是使用KVO访问它们.

//self.data has the array returned from getSavedArticles
NSManagedObject *object = [self.data objectAtIndex:indexPath.row]; 
NSString *path  = [object valueForKey:@"path"];
NSString* id      = [object valueForKey:@"id"];
Run Code Online (Sandbox Code Playgroud)

当我在变量窗格中查看此内容时path,id我看到(__NSArrayI *) ... Variable is not a CFString. …

core-data nsarray ios

5
推荐指数
1
解决办法
375
查看次数

Git instaweb:浏览器不可用

我正在尝试设置git instaweb为在Chrome中打开。我已经设置了默认的浏览器,如下所示:

git config --global web.browser chrome
Run Code Online (Sandbox Code Playgroud)

这种变化反映在我的global上.gitconfig,并且git-web--browse文档说chrome可作为一种传递的东西来使用。

当我运行时git instaweb,我得到的是:

The browser chrome is not available as 'chrome'.
http://127.0.0.1:1234    
Run Code Online (Sandbox Code Playgroud)

我也尝试过,google-chrome并且发生相同的结果。如何设置网络浏览器以chrome实际打开?

运行OSX 10.8.2

git macos

5
推荐指数
1
解决办法
930
查看次数

rac_signalForControlEvents不在UICollectionViewCell中发送信号

我有一堆UICollectionViewCells包含按钮.出于某种原因,当按钮位于按钮内时,我的信号拒绝触发UICollectionViewCell.切换到正常addTarget:action:forControlEvents:将起作用,但不是RAC信号.我在2个不同的集合视图和2个不同的自定义集合单元中发生了这种情况.

我所做的只是:

[[cell.button rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(id x) {
        // code to be executed here, which doesn't happen
}];
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

ios uicollectionviewcell reactive-cocoa

5
推荐指数
1
解决办法
759
查看次数

Rails背景图片上传导致应用程序超时

不幸的是,对于那些有类似问题的人来说,赏金被授予了一个无法解决这个问题的答案.

我有一个带图像上传的表单(heroku到s3).当我提交表单时,我的rails服务器会在向用户返回响应之前等待上传图像的后台作业.这会导致每次上传图像时应用程序超时.

目前的活动顺序:

  1. 用户提交表单
  2. 服务器接收表单
  3. 如果有图像,则服务器启动后台作业
  4. 如果后台作业已启动,则服务器等待它完成(此处的rails超时)
  5. 如果已启动,则后台作业完成
  6. 服务器处理请求
  7. 服务器响应用户

所需的活动顺序:

  1. 用户提交表单
  2. 服务器接收表单
  3. 服务器处理非图像字段
  4. 如果有图像,则服务器启动后台作业
  5. 服务器响应用户
  6. 后台作业完成,服务器处理上传的图像(保存URL)

上传代码

class PhotoUploader < CarrierWave::Uploader::Base
  include ::CarrierWave::Backgrounder::Delay
  include CarrierWave::MimeTypes
  process :set_content_type
  storage :fog
end
Run Code Online (Sandbox Code Playgroud)

Carrierwave :: Backgrounder初始化程序

CarrierWave::Backgrounder.configure do |c|
  c.backend :sidekiq, queue: :carrierwave
end
Run Code Online (Sandbox Code Playgroud)

用户模型

class User < ActiveRecord::Base
  mount_uploader :photo, PhotoUploader, delayed: true
  process_in_background :photo
end
Run Code Online (Sandbox Code Playgroud)

没有控制器代码,因为表单由ActiveAdmin处理.我可以覆盖任何需要的地方,但无法弄清楚需要改变的地方.

为了获得正确的事件顺序,我需要更改什么?

ruby-on-rails carrierwave sidekiq

5
推荐指数
1
解决办法
1319
查看次数