我目前正在尝试使用一些异步方法来创建我的应用程序.我的所有IO都是通过接口的显式实现完成的,我对如何使操作异步感到困惑.
在我看到的情况下,我在实现中有两个选项:
interface IIO
{
void DoOperation();
}
Run Code Online (Sandbox Code Playgroud)
OPTION1: 执行隐式实现异步并等待隐式实现中的结果.
class IOImplementation : IIO
{
async void DoOperation()
{
await Task.Factory.StartNew(() =>
{
//WRITING A FILE OR SOME SUCH THINGAMAGIG
});
}
#region IIO Members
void IIO.DoOperation()
{
DoOperation();
}
#endregion
}
Run Code Online (Sandbox Code Playgroud)
选项2: 显式实现异步并等待隐式实现中的任务.
class IOAsyncImplementation : IIO
{
private Task DoOperationAsync()
{
return new Task(() =>
{
//DO ALL THE HEAVY LIFTING!!!
});
}
#region IIOAsync Members
async void IIO.DoOperation()
{
await DoOperationAsync();
}
#endregion
}
Run Code Online (Sandbox Code Playgroud)
这些实现中的一个是否比另一个更好,还是有另一种方法可以解决这个问题?
我在两个不同的模型中有两个数据集合,它们实现了存储库接口.其中一个是在一个与证书库模型非常吻合的平面列表中.另一个数据模型以树结构格式化,我构建的存储库接口的实现看起来非常阴暗.我可以尝试展平第二个数据模型,只使用对父项的引用,但是目前应用程序可以将数据作为树结构获得一些很大的好处.
我想知道的是,有人有任何使用树结构化数据模型实现存储库模式的经验.目前在我的Get(Func<T, bool> predicate)方法中,我使用递归方法展平列表并使用LINQ查询返回对象,但我觉得这个实现有点代价.
任何有关如何实现这一点的提示将不胜感激.
这是get by predicate方法的实现,如果这有助于说明实现的sillines.
protected virtual IEnumerable<T> Get(Func<T, bool> predicate)
{
var objects = GetAll<T>();
return objects.Where(predicate);
}
Run Code Online (Sandbox Code Playgroud)
编辑:一些更多的代码
private IEnumerable<TreeData> GetRecursiveObjects(TreeData object)
{
var allChildren = new List<TreeData>();
allChildren.AddRange(object.Children);
foreach (var child in object.Children)
{
allChildren.AddRange(GetRecursiveObjects(child).ToArray());
}
return allChildren;
}
protected virtual IEnumerable<T> GetAll<T>()
{
var objects = new List<T>();
objects.AddRange(Objects);
foreach (var object in Objects)
{
objects.AddRange(GetRecursiveObjects(object));
}
return objects.OfType<T>();
}
Run Code Online (Sandbox Code Playgroud)
第二次编辑:
关于向存储库添加元素的好策略,我也有点困惑.我应该在使用代码中处理父元素的子元素的添加,还是存储库同时使用元素和对它的父元素的引用并处理整个add操作?
TL;博士
尝试使用树结构中的数据实现存储库接口是不是很疯狂?
我有一个非常复杂的表视图设置,我决定使用块结构来创建和选择单元格,以简化未来的开发和更改.
我正在使用的结构如下所示:
var dataSource: [(
cells:[ (type: DetailSection, createCell: ((indexPath: NSIndexPath) -> UITableViewCell), selectCell: ((indexPath: NSIndexPath) -> ())?, value: Value?)],
sectionHeader: (Int -> UITableViewHeaderFooterView)?,
sectionFooter: (Int -> UITableViewHeaderFooterView)?
)] = []
Run Code Online (Sandbox Code Playgroud)
然后我可以在setup函数中设置表格,并使我的委托方法相当简单
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = dataSource[indexPath.section].cells[indexPath.row].createCell(indexPath:indexPath)
return cell
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return dataSource[section].cells.count
}
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return dataSource.count
}
Run Code Online (Sandbox Code Playgroud)
我之前在另一个TVC做过类似的设置
var otherVCDataSource: [[ (type: DetailSection, createCell: ((indexPath: NSIndexPath) -> UITableViewCell), …Run Code Online (Sandbox Code Playgroud) 我在使用iOS evernote SDK在链接笔记本中创建笔记时遇到了一些问题.
我试图简单地得到有问题的noteStore
EvernoteNoteStore* noteStore = [EvernoteNoteStore noteStoreForLinkedNotebook:self.linkedNotebook];
Run Code Online (Sandbox Code Playgroud)
然后我尝试用它创建一个音符
[noteStore createNote:note success:success failure:^(NSError *error) {
NSLog(@"%@", error);
}];
Run Code Online (Sandbox Code Playgroud)
这总是以错误结束,表示我无权创建注释.
我已经进一步尝试使用我链接的笔记本中的共享密钥进行身份验证,但是在故障块中也出现了相同的错误.
[noteStore authenticateToSharedNotebookWithShareKey:self.linkedNotebook.shareKey success:^(EDAMAuthenticationResult *result) {
[noteStore createNote:note success:success failure:^(NSError *error) {
NSLog(@"%@", error);
}];
} failure:^(NSError *error) {
NSLog(@"%@", error);
}];
Run Code Online (Sandbox Code Playgroud)
如何解决在链接笔记本中创建笔记的问题?
我想将一个整数舍入到其最接近的3的倍数.示例:
var numberOne = 2
var numberTwo = 7
Run Code Online (Sandbox Code Playgroud)
我不希望它永远倒下.
有任何想法吗?谢谢
我有一个日志记录接口,我使用一些有用的扩展方法对其进行了扩展,以便我可以传递格式和参数列表,以避免每次调用该方法时都必须使用字符串格式。(它还帮助我遵循 FXCops 文化信息规则)
所以我可以打电话:
logger.Debug("Created {0} with id {1}",typeof(MyObject).Name ,myObject.Id);
Run Code Online (Sandbox Code Playgroud)
代替:
logger.Debug(string.Format("Created {0} with id {1}", typeof(MyObject).Name, myObject.Id));
Run Code Online (Sandbox Code Playgroud)
我现在发现自己处于一个有点棘手的情况,因为在日志中获取一些关于日志记录位置的信息(例如文件、方法和行号)会非常有帮助。这可能与整齐的实现[CallerMemberName],[CallerFilePath]和[CallerLineNumber]属性。
logger.Debug("Created {0} with id {1}", typeof(MyObject).Name, myObject.Id);
Run Code Online (Sandbox Code Playgroud)
然后会给我一个日志条目,例如:
“MyObjectProvider.cs,提供,第 50 行 | 创建的 MyObject,ID 为 1564”
这里的问题是方法签名看起来像这样:
public static void Debug(this ILogger logger, string format [CallerMemberName] string callerMemberName = "", [CallerFilePath] string callerFilePath = "", [CallerLineNumber] int callerLineNumber = 0, params object[] args)
Run Code Online (Sandbox Code Playgroud)
这是不可能的,因为[Caller*]属性使参数成为可选的,并且不适用于 args 参数。
我还尝试使用固定数量的字符串作为参数进行多个实现,如下所示:
public static void Debug(this ILogger logger, …Run Code Online (Sandbox Code Playgroud) 试图创建一个通用数据源我遇到了这个错误,我想知道为什么这是不可编译的.
错误:
无法将类型为'[Int]'的返回表达式转换为返回类型'[Int]'
代码:
protocol DataSource {
func getData<T> () -> [T]
}
class IntDataSource<Int>: DataSource {
let data:[Int] = []
func getData<Int>() -> [Int] {
return data
}
}
Run Code Online (Sandbox Code Playgroud)
在IntDataSource中的return语句上抛出错误.
我知道这可以通过更好的方式完成
typealias DataType
var data: DataType? { get }
Run Code Online (Sandbox Code Playgroud)
但我主要感兴趣的是为什么编译器不想接受return语句.有任何想法吗?
编辑:
问题的一部分也是为什么如果以前的代码不可编译是下面的公平游戏?
class IntDataSource<Int>: DataSource {
func getData<Int>() -> [Int] {
let data:[Int] = []
return data
}
}
Run Code Online (Sandbox Code Playgroud)
编辑2:
这个版本也编译没有问题
class IntDataSource<Int>: DataSource {
func getData<Int>() -> [Int] {
return getIntData()
}
func getIntData<Int>() -> [Int] {
let …Run Code Online (Sandbox Code Playgroud) 我正在寻找一个术语来描述将在泛型方法的显式实现中替换的类型.
我的场景是这样的:
我很乐意和一个名叫肯特的家伙一起编程.肯特写了一个关于通用方法的明确实现,我想告诉他他做错了.
public void Foo<______> (______ buzz)
{
buzz.Bar();
}
Run Code Online (Sandbox Code Playgroud)
所以我说:"嘿肯特,你应该把那个_改成MyClass"
有人可以帮助我用更聪明的声音替换这个__吗?也许是"TargetType","ExplicitType"或"thingamagig"?
需要发送到服务器的JSON是这样的:
[
{
"value": "0",
"optionId": "de07a0ae-9b85-4f2a-bd8f-28f0ccb55f81"
},
{
"value": "1",
"optionId": "abe075ef-d76e-45e0-ace9-e73218604b87"
},
{
"value": "0",
"optionId": "820124a6-a6ed-499e-8d0d-7ac04160f56d"
},
{
"value": "0",
"optionId": "0d8cb27a-2659-4e54-a4f0-0b0a10131da5"
}
]
Run Code Online (Sandbox Code Playgroud)
所以我创建了一个Dictionaries数组:
var parameters = [[String:NSObject]]()
Run Code Online (Sandbox Code Playgroud)
但Alamofire只接受字典.有没有办法自己做JSON编码把它作为参数传递给Alamofire?或者你会如何解决它?
无法将'[[String:NSObject]]'类型的值转换为预期的参数类型'[String:AnyObject]?'
c# ×4
swift ×4
generics ×2
alamofire ×1
ambiguous ×1
args ×1
arguments ×1
async-await ×1
asynchronous ×1
evernote ×1
integer ×1
ios ×1
objective-c ×1
rounding ×1
swift2 ×1
terminology ×1
tree ×1
uitableview ×1